SQL Server 2016 представил оператор AT TIME ZONE
.
Обратите внимание:
SELECT CONVERT(date, TheDateTime AT TIME ZONE 'UTC'
AT TIME ZONE 'Central Europe Standard Time')
Приведенное выше сначала преобразует поле TheDateTime
из datetime
или (datetime2
) для типа datetimeoffset
со смещением нуля (UTC).Затем он преобразует его в зону Central Europe Standard Time
и, наконец, преобразует его в тип date
, удаляя любую информацию о времени.
Что касается вашего утверждения:
...> = 2020-01-01 ", следовательно, не удается найти эти строки.
Вместо этого следует рассмотреть возможность преобразования противоположного направления, чтобы выполнить запрос по времени UTC - что будет sargable . Например:
SELECT ...
WHERE TheDateTime >= CONVERT(datetime,
'2020-01-01' AT TIME ZONE 'Central Europe Standard Time'
AT TIME ZONE 'UTC')
Конечно, вы можете сделать всю правую часть выражения раньше времени и использовать вместо него локальную переменную. Аналогично, если вы вызываете этот запросиз приложения вы можете конвертировать в код приложения UTC в коде приложения и вообще не беспокоиться об этом в SQL Server.