Объявление переменной в TSQL с использованием CAST и GETUTCDATE() … Каков наиболее эффективный способ?

#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. Спасибо за объяснение. Меня не слишком беспокоит, для чего я ее использую, если значение остается неизменным. Он просто используется в быстром запросе, который выполняется в середине дня.