Mysql 查询特定日期和时间范围
Mysql query for specific date and time range
我有table这样
+--------+------------------+------------------+
| Job | jobRegisterTime | Job done time |
+--------+------------------+------------------+
| job 1 | 2020-09-01 19:28 | 2020-09-02 10:28 |
| job 2 | 2020-09-02 09:28 | 2020-09-02 19:28 |
| job 3 | 2020-09-02 09:28 | 2020-09-02 10:28 |
| job 4 | 2020-09-04 09:28 | 2020-09-05 10:28 |
| job 5 | 2020-09-05 09:28 | 2020-09-05 10:28 |
| job 6 | 2020-09-12 09:28 | 2020-09-12 16:28 |
| job 7 | 2020-09-13 09:28 | 2020-09-13 10:28 |
| job 8 | 2020-09-14 09:28 | 2020-09-14 19:28 |
| job 9 | 2020-09-15 09:28 | 2020-09-16 10:28 |
| job 10 | 2020-09-16 19:28 | 2020-09-17 10:28 |
| job 11 | 2020-09-17 15:28 | 2020-09-18 05:28 |
| job 12 | 2020-09-12 09:28 | 2020-09-12 09:58 |
+--------+------------------+------------------+
而且我不知道如何编写好的查询。条件第一部分计算整个月注册时间之间的日期范围内的所有工作,例如 2020-09-01 和 2020-09-30 这个很容易,我将在何处和之间使用。第二部分是过滤工作时间从 8 小时到 17 小时之间 2 小时内完成的工作。问题是我需要包括像这个例子这样的工作,如果工作在 16 点注册并在第二天完成直到 9 点才算数,因为下班后直到下一个工作日都是零。
再举几个例子:
Register time | Done time
2020-09-16 19:28 | 2020-09-17 9:28 = counts (Because it registered after work and done next day in work hours done 9:28 - 8:00 = 1:28
2020-09-16 11:28 | 2020-09-16 19:28 = doesn't count( range more than two hours)
2020-09-15 15:30 | 2020-09-16 08:30 Counts (because exclude not work hours. Difference 17:00 - 15:30 = 1:30 and 8:30 - 8:00 = 0:30 1:30 +0:30 = 2:00h
谁能帮忙写出正确的条件?
你基本上可以做这样的事情来获得不包括 16:00 - 08:00 的工作持续时间。 (https://www.db-fiddle.com/f/jJUhydQkhfwKkjqhCQPN7b/0)
SELECT CASE
WHEN DATE(jobDoneTime) > DATE(jobRegisterTime)
THEN TIMESTAMPDIFF(MINUTE,jobRegisterTime,jobDoneTime)- 16*60
ELSE TIMESTAMPDIFF(MINUTE,jobRegisterTime,jobDoneTime) END duration_minutes,
Job, jobRegisterTime, JobDoneTime
FROM job
但是您的数据有一些边缘情况,其中开始 and.or 结束时间位于 08:00 - 16:00 之外。在这种情况下,您可能需要弄清楚您想要什么。
我有table这样
+--------+------------------+------------------+
| Job | jobRegisterTime | Job done time |
+--------+------------------+------------------+
| job 1 | 2020-09-01 19:28 | 2020-09-02 10:28 |
| job 2 | 2020-09-02 09:28 | 2020-09-02 19:28 |
| job 3 | 2020-09-02 09:28 | 2020-09-02 10:28 |
| job 4 | 2020-09-04 09:28 | 2020-09-05 10:28 |
| job 5 | 2020-09-05 09:28 | 2020-09-05 10:28 |
| job 6 | 2020-09-12 09:28 | 2020-09-12 16:28 |
| job 7 | 2020-09-13 09:28 | 2020-09-13 10:28 |
| job 8 | 2020-09-14 09:28 | 2020-09-14 19:28 |
| job 9 | 2020-09-15 09:28 | 2020-09-16 10:28 |
| job 10 | 2020-09-16 19:28 | 2020-09-17 10:28 |
| job 11 | 2020-09-17 15:28 | 2020-09-18 05:28 |
| job 12 | 2020-09-12 09:28 | 2020-09-12 09:58 |
+--------+------------------+------------------+
而且我不知道如何编写好的查询。条件第一部分计算整个月注册时间之间的日期范围内的所有工作,例如 2020-09-01 和 2020-09-30 这个很容易,我将在何处和之间使用。第二部分是过滤工作时间从 8 小时到 17 小时之间 2 小时内完成的工作。问题是我需要包括像这个例子这样的工作,如果工作在 16 点注册并在第二天完成直到 9 点才算数,因为下班后直到下一个工作日都是零。
再举几个例子:
Register time | Done time
2020-09-16 19:28 | 2020-09-17 9:28 = counts (Because it registered after work and done next day in work hours done 9:28 - 8:00 = 1:28
2020-09-16 11:28 | 2020-09-16 19:28 = doesn't count( range more than two hours)
2020-09-15 15:30 | 2020-09-16 08:30 Counts (because exclude not work hours. Difference 17:00 - 15:30 = 1:30 and 8:30 - 8:00 = 0:30 1:30 +0:30 = 2:00h
谁能帮忙写出正确的条件?
你基本上可以做这样的事情来获得不包括 16:00 - 08:00 的工作持续时间。 (https://www.db-fiddle.com/f/jJUhydQkhfwKkjqhCQPN7b/0)
SELECT CASE
WHEN DATE(jobDoneTime) > DATE(jobRegisterTime)
THEN TIMESTAMPDIFF(MINUTE,jobRegisterTime,jobDoneTime)- 16*60
ELSE TIMESTAMPDIFF(MINUTE,jobRegisterTime,jobDoneTime) END duration_minutes,
Job, jobRegisterTime, JobDoneTime
FROM job
但是您的数据有一些边缘情况,其中开始 and.or 结束时间位于 08:00 - 16:00 之外。在这种情况下,您可能需要弄清楚您想要什么。