MySQL:如何在某些条件下选择特定时间范围之间的最大/最小时间数据?

标签 mysql date time range

我有一组像这样的表的数据:

ID    sTime                  sDate       Pin    Name
29    5/4/2015 7:07:05 AM    5/4/2015    118    Sigit
30    5/4/2015 7:07:08 AM    5/4/2015    118    Sigit
31    5/4/2015 7:12:31 AM    5/4/2015    184    Aprilia
32    5/4/2015 7:13:20 AM    5/4/2015    182    Siska
33    5/4/2015 7:17:12 AM    5/4/2015    102    Sugandi
34    5/4/2015 7:17:14 AM    5/4/2015    102    Sugandi
35    5/4/2015 7:17:28 AM    5/4/2015    29     Ade
36    5/4/2015 7:17:33 AM    5/4/2015    164    Hendrik
37    5/4/2015 7:17:37 AM    5/4/2015    104    Rahmat
38    5/4/2015 7:17:41 AM    5/4/2015    67     Endang
39    5/4/2015 7:17:45 AM    5/4/2015    43     Dedy
40    5/4/2015 7:17:47 AM    5/4/2015    43     Dedy
41    5/4/2015 7:18:16 AM    5/4/2015    12     Toni
42    5/4/2015 7:19:16 AM    5/4/2015    115    Dedi
43    5/4/2015 7:20:14 AM    5/4/2015    30     Dadang
44    5/4/2015 7:21:58 AM    5/4/2015    165    Muammad
45    5/4/2015 7:22:00 AM    5/4/2015    165    Muammad
46    5/4/2015 7:22:02 AM    5/4/2015    165    Muammad
47    5/4/2015 7:22:04 AM    5/4/2015    165    Muammad
151   5/4/2015 4:03:53 PM    5/4/2015    43     Dedy
152   5/4/2015 4:03:58 PM    5/4/2015    164    Hendrik
153   5/4/2015 4:04:04 PM    5/4/2015    26     Syamsuddin
154   5/4/2015 4:04:09 PM    5/4/2015    26     Syamsuddin
155   5/4/2015 4:04:21 PM    5/4/2015    19     Eddy
156   5/4/2015 4:04:32 PM    5/4/2015    133    Haetami
157   5/4/2015 4:04:38 PM    5/4/2015    92     Budi
158   5/4/2015 4:05:05 PM    5/4/2015    131    Rosadi
159   5/4/2015 4:05:29 PM    5/4/2015    115    Dedi
160   5/4/2015 4:05:48 PM    5/4/2015    80     Cahya
161   5/4/2015 4:05:54 PM    5/4/2015    125    Yahya

每个名字和每天的条件:

  • 选择 07.00 到 08.30 之间的最早 sTime 值
  • 选择 16.00 至 17.15(04.00 PM - 05.15 PM)之间的最新 sTime 值

所选数据:

ID    sTime                  sDate       Pin    Name
29    5/4/2015 7:07:05 AM    5/4/2015    118    Sigit
31    5/4/2015 7:12:31 AM    5/4/2015    184    Aprilia
32    5/4/2015 7:13:20 AM    5/4/2015    182    Siska
33    5/4/2015 7:17:12 AM    5/4/2015    102    Sugandi
35    5/4/2015 7:17:28 AM    5/4/2015    29     Ade
36    5/4/2015 7:17:33 AM    5/4/2015    164    Hendrik
37    5/4/2015 7:17:37 AM    5/4/2015    104    Rahmat
38    5/4/2015 7:17:41 AM    5/4/2015    67     Endang
39    5/4/2015 7:17:45 AM    5/4/2015    43     Dedy
41    5/4/2015 7:18:16 AM    5/4/2015    12     Toni
42    5/4/2015 7:19:16 AM    5/4/2015    115    Dedi
43    5/4/2015 7:20:14 AM    5/4/2015    30     Dadang
44    5/4/2015 7:21:58 AM    5/4/2015    165    Muammad
151   5/4/2015 4:03:53 PM    5/4/2015    43     Dedy
152   5/4/2015 4:03:58 PM    5/4/2015    164    Hendrik
154   5/4/2015 4:04:09 PM    5/4/2015    26     Syamsuddin
155   5/4/2015 4:04:21 PM    5/4/2015    19     Eddy
156   5/4/2015 4:04:32 PM    5/4/2015    133    Haetami
157   5/4/2015 4:04:38 PM    5/4/2015    92     Budi
158   5/4/2015 4:05:05 PM    5/4/2015    131    Rosadi
159   5/4/2015 4:05:29 PM    5/4/2015    115    Dedi
160   5/4/2015 4:05:48 PM    5/4/2015    80     Cahya
161   5/4/2015 4:05:54 PM    5/4/2015    125    Yahya

并像这样显示它:

Name        Date        In Time    Out Time
Sigit       5/4/2015    7:07:05
Aprilia     5/4/2015    7:12:31
Dedy        5/4/2015    7:17:45    16:03:53
Dedi        5/4/2015    7:19:16    16:05:29
Cahya       5/4/2015               16:05:48
Yahya       5/4/2015               16:05:54

我已经爬过任何类似的查询,但找不到确切的解决方案。

如有任何帮助,我们将不胜感激。谢谢!

最佳答案

这假设 sTime 是您显示的格式的字符串。

SELECT name, date, IFNULL(intime, '') `In Time`, IFNULL(outtime, '') `Out Time`
FROM (
    SELECT name, sdate AS date, 
        MIN(IF(SUBSTRING_INDEX(sTime, ' ', -2) BETWEEN '7:00:00 AM' AND '8:30:00 AM', 
                SUBSTRING_INDEX(SUBSTRING_INDEX(sTime, ' ', 2), ' ', -1), 
                NULL)) AS intime,
        MAX(IF(SUBSTRING_INDEX(sTime, ' ', -2) BETWEEN '4:00:00 PM' AND '5:15:00 PM', 
                SUBSTRING_INDEX(SUBSTRING_INDEX(sTime, ' ', 2), ' ', -1), 

                NULL)) AS outtime
    FROM YourTable
    GROUP BY name, sdate
    HAVING intime IS NOT NULL OR outtime IS NOT NULL
    ) AS x
ORDER BY intime IS NULL, intime, outtime

DEMO

关于MySQL:如何在某些条件下选择特定时间范围之间的最大/最小时间数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31263540/

相关文章:

php - 尝试在 php 函数内部使用 mysql 查询从数据库调用数据。

php - 无法使用 ORDER BY 和 php IF 选择表单 DB

javascript - 生成日期并将新属性添加到对象数组中

c - C中的格式化耗时

c++ - 如何使用 Boost 库计算两个时间戳之间的时间差(以微秒为单位)

php - 无法使用 PDO 从 MySQL 中获取多行

android - 如何根据在 ListView 中单击的特定项目向新 Intent 显示所有数据

javascript - Bootstrap 日期时间选择器中的出生日期验证

javascript - 为什么 'getTimezoneOffset' 在 Date.prototype 中实现而不是作为 Date 的静态方法?

python - python无限循环和time.sleep()有什么问题吗?