SQL - В ЧАСОВОЙ ПОЯС

У меня есть этот запрос, который правильно возвращает среднеевропейское время как +2 часа. Однако эти два часа ко времени не прибавляются. Как мне добавить эти два часа (или x часов в зависимости от часового пояса)?

DECLARE @targettimezone AS sysname = 'Central European Standard Time'
SELECT convert(datetime2,'2018-10-25T13:43:19.296Z') AT TIME ZONE @targettimezone;

Какая версия SQL Server у вас установлена?

tj-cappelletti 25.10.2018 18:14
SELECT convert(datetime2,convert(datetimeoffset,'2018-10-25T13:43:1‌​9.296Z') AT TIME ZONE @targettimezone);
Aaron Bertrand 25.10.2018 18:16
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
2
3 681
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете попробовать использовать datetimeoffset вместо datetime2.

Defines a date that is combined with a time of a day that has time zone awareness and is based on a 24-hour clock.

Затем конвертируйте datetimeoffset в DateTime, чтобы получить ожидаемый результат.

DECLARE @targettimezone AS sysname = 'Central European Standard Time'
SELECT cast(cast('2018-10-25T13:43:19.296Z' as datetimeoffset) AT TIME ZONE @targettimezone as datetime2);

sqlfiddle

Это все еще возвращается с битом +02:00, желательно ли это?

Aaron Bertrand 25.10.2018 18:19

@AaronBertrand Хорошо, спасибо за указание на приведение к типу DateTime, снова могу это сделать.

D-Shih 25.10.2018 18:20

Вам нужно зафиксировать смещение с помощью функции DATEPART в SQL Server, а затем применить его к своему времени в формате UTC.

DECLARE @utcDateTime DATETIME = '2018-10-25T13:43:19.296Z'
DECLARE @targetTimeZone AS SYSNAME = 'Central European Standard Time'

DECLARE @offsetMinutes INT
DECLARE @targetDateTime DATETIME

--Get the offset value in minutes
SET @offsetMinutes = DATEPART(tz, CONVERT(DATETIME2, @utcDateTime) AT TIME ZONE 
@targettimezone)
--Add the offset to the UTC time
SET @targetDateTime = DATEADD(MINUTE, @offsetMinutes, @utcDateTime)

--No you have the value in the target time zone
SELECT @targetDateTime

Давайте немного поможем движку:

DECLARE @targettimezone AS sysname = 'Central European Standard Time'
SELECT convert(datetime2,'2018-10-25T13:43:19.296Z') 
    AT TIME ZONE 'UTC' 
    AT TIME ZONE @targettimezone;

Я бы ожидал, что формат, который вы указали для своей метки времени, изначально будет интерпретироваться как UTC, но, похоже, это не так. Таким образом, вышесказанное прямо об этом. ¯ \ _ (ツ) _ / ¯

Другие вопросы по теме