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;
显示每个地点的广播日期的新列。
答案 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