Как написать этот SQL (о дате и времени)? - PullRequest
0 голосов
/ 28 июня 2019

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 утра по восточному времени.Таким образом, если эфир будет показан 3 июня в 7:00:00 утра по восточному времени, то дата трансляции этого ролика будет 3 июня.Но если ролик выйдет 3 июня в 5:00:00 утра по восточному времени, то дата трансляции этого ролика будет 2 июня.Пожалуйста, включите в ваш запрос вычисляемое поле, в котором указана дата трансляции каждого ролика.

Я пытался написать sql с функцией CASE WHEN, CAST и DATE_FORMAT, DATE_ADD, чтобы сравнить spot_datetime для определения даты трансляции, но это не так.'t work.

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 Ответ

2 голосов
/ 28 июня 2019

Почему бы просто не вычесть шесть часов из даты и времени, а затем обрезать часть времени, например,

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
...