Почему бы просто не вычесть шесть часов из даты и времени, а затем обрезать часть времени, например,
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'
- это двенадцатичасовые часы (01.12), которые предназначены для AM и PM, поэтому нам действительно нужно добавить AM / Дискриминатор ПМ. Или мы могли бы использовать модель формата '%H'
для 24-часовых часов (00..23)
, например
DATE(spot_datetime) + INTERVAL IF(DATE_FORMAT(spot_datetime,'%H') < '06',-1,0) DAY