Интуитивно, эти два интервала представляют одинаковое количество времени. Но разница проявляется в изменениях летнего времени, и в этом случае «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 часов.