Региональная семантика TIME WITH TIME ZONE
По определению региональные часовые пояса зависят от момента (дата и время — или timestamp), чтобы узнать его смещение UTC относительно GMT.Но Firebird также поддерживает региональные часовые пояса в значениях TIME WITH TIME ZONE
.
При построении значения TIME WITH TIME ZONE
из литерала или его преобразования, значение UTC должно быть вычислено и не может быть изменено, поэтому текущая дата может не использоваться.В этом случае используется фиксированная дата 2020-01-01
.Таким образом, при сравнении TIME WITH TIME ZONE
с различными часовыми поясами сравнение выполняется аналогично тому, как они представляют собой значения TIMESTAMP WITH TIME ZONE
на заданную дату.
Однако при преобразовании между типами TIMESTAMP
в TIME WITH TIME ZONE
эта фиксированная дата не используется,в противном случае могут наблюдаться некоторые странные преобразования, когда текущая дата имеет другое смещение (из-за изменений летнего времени), чем в 2020-01-01
.В этом случае при преобразовании TIME WITH TIME ZONE
в TIMESTAMP WITH TIME ZONE
сохраняется часть времени (если это возможно).Например, если текущая дата 2020-05-03
, эффективное смещение в часовом поясе America/Los_Angeles равно -420, а его эффективное смещениев 2020-01-01
равно -480, но cast(time '10:00:00 America/Los_Angeles' as timestamp with time zone)
даст в результате 2020-05-03 10:00:00.0000 America/Los_Angeles
вместо корректировки временной части.
Но в дату, когда начинается летнее время, пропущен час, например, для часового пояса America/Los_Angeles в 2021-03-14
нет времени с 02:00:00
до 02:59:59
.В этом случае преобразование выполняется как построение литерала, и час корректируется до следующего допустимого значения.Например, в 2021-03-14
cast(time '02:10:00 America/Los_Angeles' as timestamp with time zone)
даст результат 2021-03-14 03:10:00.0000 America/Los_Angeles
.