Объявление переменной в TSQL с помощью CAST и GETUTCDATE () ... Какой самый эффективный способ? - PullRequest
0 голосов
/ 29 марта 2019

Если я использую:

declare @CurrentDate as date = cast(getutcdate() at time zone 'utc' at time zone 'Pacific Standard Time' as date)

Выполняется ли CAST каждый раз, когда я вызываю переменную, или просто в первоначальном объявлении оператора?

1 Ответ

4 голосов
/ 29 марта 2019

getutcdate() и окружающие cast() вызываются только при первом назначении переменной @CurrentDate. Переменные значения , а не функции. Вы создаете переменную с определенным типом и назначаете ей конкретное значение этого типа.

Однако тип *1009* для @CurrentVariable равен Date ... не DateTime. Не DateTime2. Не DateTimeOffset. Это означает, что переменная содержит только информацию Date. Компонент времени отсутствует, поэтому на сегодняшний день назначенное значение 2019-03-29 будет оставаться действительным весь день.

Очень скоро дата UTC станет 2019-03-30. Это произойдет в Англии (или где-нибудь с положительным смещением UTC) задолго до того, как это произойдет где-нибудь в США. Тем не менее, значение в переменной останется 2019-30-29.

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

...