Всегда ли INTERVAL '1' DAY равен INTERVAL '24' HOURS? - PullRequest
3 голосов
/ 29 апреля 2020

Интуитивно, эти два интервала представляют одинаковое количество времени. Но разница проявляется в изменениях летнего времени, и в этом случае «1 день» может означать «23 часа» весной или «25 часов» осенью.

Я тестировал с PostgreSQL и там эти два интервала не означают одинаковое количество времени:

set timezone TO 'CET';
SELECT timestamp with time zone'2020-03-29 0:00 Europe/Bratislava' + INTERVAL '1' DAY,
       timestamp with time zone'2020-03-29 0:00 Europe/Bratislava' + INTERVAL '24' HOUR;

возвращает это:

2020-03-29T22:00:00.000Z    2020-03-29T23:00:00.000Z

Часовой пояс клиента был UT C, поэтому возвращаемые значения в UT C. Но важно то, что они не совпадают.

Я также пробовал с MySQL, но мне кажется, что он не поддерживает часовые пояса, только смещения часовых поясов. А смещения зон не имеют изменений летнего времени, поэтому день всегда равен 24 часам.

С другой стороны, Apache Кальцит, который поддерживает многие реализации SQL, такие как Apache Drill, Apache Flink , Apache Beam и многие другие, представляет интервальные литералы как java BigDecimal: интервал день-секунда преобразуется в миллисекунды, а день всегда равен 24 часам.

Мой вопрос : какой подход является правильным в соответствии со стандартом SQL?

РЕДАКТИРОВАТЬ:

Проверено больше БД:

  • Oracle: SELECT INTERVAL '1' DAY FROM DUAL возвращает +01 00:00:00. Добавление либо 1 дня, либо 24 часов к 2020-03-29 0:00 CET дает тот же результат: добавляется 24 часа.
  • SQL Сервер и DB2 : насколько я могу сказать, поддерживаются только смещения часового пояса. То же самое, что и MySql: они не поддерживают часовые пояса с изменениями летнего времени.

Вывод: PostgreSQL представляется единственным исключением, когда 1 день отличается от 24 часов.

...