如何写这个SQL(关于日期和时间)?

时间:2019-06-28 19:48:46

标签: mysql sql datetime case-when

spot_datetime

2019-04-10  17:36:00
2019-04-05  17:22:00
2019-04-03  18:52:00
2019-04-09  18:12:00
2019-04-05  18:14:00
2019-04-12  16:23:00
2019-04-09  18:43:00
2019-04-16  18:35:00
2019-04-11  16:53:00
2019-04-25  00:57:00
2019-04-09  00:25:00
2019-04-21  00:59:00
2019-04-24  01:04:00
2019-02-25  00:59:00
2019-04-09  02:41:00
2019-04-17  03:28:00
2019-02-24  02:55:00
2019-02-24  03:26:00
2019-02-25  02:47:00
2019-04-16  23:27:00
2019-04-23  21:01:00

...

广播日期开始于美国东部时间6:00:00,结束于美国东部时间5:59:59。因此,如果某个地点在美国东部时间6月3日上午7:00:00播出,则该地点的广播日期为6月3日。但是,如果某个地点在美国东部时间6月3日上午5:00:00播出,则该地点的广播日期为6月2日。请在查询中包括一个计算所得的字段,以提供每个地点的广播日期。

我试图用CASE WHEN函数,CAST和DATE_FORMAT,DATE_ADD来编写sql,以比较spot_datetime来确定广播日期,但这是行不通的。

select spot_datetime,
case when date_format(spot_datetime, '%h:%i:%s') < cast(06:00:00 as time)
then ...
eles date_add(spot_datetime, interval 1 day) end as broadcast_date
from TABLE_A;

显示每个地点的广播日期的新列。

1 个答案:

答案 0 :(得分:2)

为什么不从日期时间中减去六个小时,然后截断时间部分,例如

SELECT r.spot_datetime
     , DATE( r.spot_datetime + INTERVAL -6 HOUR ) AS bcast_date
  FROM ( SELECT '2019-06-03 05:00' AS spot_datetime
         UNION ALL SELECT '2019-06-03 06:00'
         UNION ALL SELECT '2019-06-03 07:00'
       ) r

返回

spot_datetime     bcast_date
----------------  ----------
2019-06-03 05:00  2019-06-02
2019-06-03 06:00  2019-06-03
2019-06-03 07:00  2019-06-03

(这假设不需要时区转换,即广播日期边界与spot_datetime标记在同一时区中。)


我们应该具有在春季和秋季的星期日更改夏令时的测试用例:

spot_datetime     bcast_date
----------------  ----------

2019-03-10 05:00  2019-03-09
2019-03-10 05:30  2019-03-09
2019-03-10 06:00  2019-03-10

2019-11-03 05:00  2019-11-02
2019-11-03 05:30  2019-11-02
2019-11-03 06:00  2019-11-03

但是,如果我们要使用DATE_FORMAT的方法,请注意'%h'格式是适用于AM和PM的十二小时制(01..12),因此我们确实需要添加一个AM / PM鉴别器。或者我们可以将'%H'格式模型用于24小时制(00..23)

例如

DATE(spot_datetime) + INTERVAL IF(DATE_FORMAT(spot_datetime,'%H') < '06',-1,0) DAY