Конвертировать дату в ISO 8601 в SQL Сервер ЗА JSON ПУТЬ? - PullRequest
2 голосов
/ 21 апреля 2020

Я преобразую данные в json (используя FOR JSON PATH) на SQL сервере, один из столбцов в этих данных имеет тип данных datetime, который мне нужно преобразовать в ISO8601

Правильный формат: 2018-11-13T20:20:39+00:00

Когда я попробовал CONVERT(NVARCHAR(33), datetimecolumn, 127), результат будет: 2019-10-24T12:35:12.870

Когда я попробовал TODATETIMEOFFSET(datetimecolumn, '+00:00'), результат будет: 2015-03-31T00:00:00Z

В обоих случаях я не получаю +00:00.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

JSON (как формат обмена данными) не определяет формат для значений даты и времени. FOR JSON неявно преобразует значения даты и времени в строки, но вы можете привести значения datetime в вашем выражении с соответствующим типом и стилем перед использованием FOR JSON:

Оператор:

SELECT CONVERT(varchar(30), CONVERT(datetimeoffset(0), GETDATE()), 126) AS T
FOR JSON PATH

Результат:

[{"T":"2020-04-22T08:02:58+00:00"}]

Если вы хотите преобразовать в указанный c часовой пояс, вы можете попробовать использовать AT TIME ZONE:

Statement :

SELECT CONVERT(nvarchar, CONVERT(datetime2(0), GETDATE()) AT TIME ZONE 'Central European Standard Time', 126) AS T 
FOR JSON PATH

Результат:

[{"T":"2020-04-24T08:33:49+02:00"}]
0 голосов
/ 21 апреля 2020

Похоже, что SQL Сервер представляет нулевое смещение или время UT C с Z.

Если вы запустите SELECT TODATETIMEOFFSET(GETDATE(),60), который захватывает текущее время и применяет смещение в 1 час, вы получите ожидаемый формат. Тем не менее, я считаю, что Z, обозначающий UT C, вполне приемлемо в ISO8601, но может ошибаться.

Эта команда выводит JSON, как и ожидалось.

SELECT TODATETIMEOFFSET(GETDATE(),60) as T FOR JSON PATH

Если важно, чтобы смещение нуля было представлено как 00:00, я полагаю, что вы будете вынуждены работать со строками.

select CAST(CONVERT(NVARCHAR(33), getdate(), 127) as NVARCHAR(35)) + '+00:00' as T FOR JSON PATH

...