#sql-server #tsql #declare #getdate
#sql-server #tsql #объявить #getdate
Вопрос:
Если я использую:
declare @CurrentDate as date = cast(getutcdate() at time zone 'utc' at time zone 'Pacific Standard Time' as date)
Выполняется ли ПРИВЕДЕНИЕ каждый раз, когда я вызываю переменную, или только в начальной инструкции declare?
Комментарии:
1. приведение происходит при инициализации. currentdate имеет тип date. переменная не преобразует данные, ей могут быть только присвоены данные. создайте функцию для преобразования строковых данных в универсальное время.
Ответ №1:
getutcdate()
и окружающие cast()
вызываются только при первом назначении @CurrentDate
переменной. Переменные — это значения, а не функции. Вы создаете переменную с определенным типом и присваиваете ей определенное значение этого типа.
Однако тип переменной @CurrentVariable
является Date
… нет DateTime
. Нет DateTime2
. Нет DateTimeOffset
. Это означает, что переменная содержит только Date
информацию. Временной компонент отсутствует, и поэтому на сегодняшний день присвоенное 2019-03-29
значение будет оставаться действительным весь день.
Очень скоро дата UTC станет 2019-03-30
. Это произойдет в Англии (или где-нибудь с положительным смещением UTC) задолго до того, как это произойдет где-либо в США. Даже в этом случае значение в переменной останется 2019-30-29
.
Что действительно сбивает с толку, так это когда вы назначаете переменную в месте, где значение даты отличается от местного времени, и переход происходит, когда программа все еще запущена. Значение в переменной никогда не меняется, если вы не присвоите ему значение повторно… но ожидаемое значение этого значения меняется.
Комментарии:
1. Это то, что я предполагал, но хотел проверить. Спасибо за быстрый ответ.
2. Спасибо за объяснение. Меня не слишком беспокоит, для чего я ее использую, если значение остается неизменным. Он просто используется в быстром запросе, который выполняется в середине дня.