Как преобразовать этот конкретный varchar в удобочитаемый формат даты?

#json #sql-server #tsql #datetime

Вопрос:

Я хочу преобразовать actual_arrival и actual_departure в удобочитаемую дату, а затем увидеть все в виде простой таблицы. На данный момент я получаю сообщение об ошибке:

Ошибка преобразования при преобразовании даты и/или времени из символьной строки

Как это сделать?

 Declare @json varchar(MAX) = ' {"stops":   {  "type": "stop",  "name": "stops",  "company_id": "xxx",  "actual_arrival": "20210910130000-0500",  "actual_departure": "20210910140000-0500"} }';  SELECT * FROM OPENJSON ( @json, '$.stops' )  WITH (   Type Varchar(50) '$.type',  Name Varchar(50) '$.name',  CompID Varchar(100) '$.company_id' ,  AcArrvl DATETIME '$.actual_arrival' ,  AcDprtr DATETIME '$.actual_departure') as j1  

Комментарии:

1. Какие результаты вы ожидаете получить от выборочных данных?

2. Таблица со всеми столбцами от «тип» до «AcDprtr» (как вы видите, их 5 )

3. Это не объясняет «дату, читаемую человеком». Становится ли количество крутонов базового цикла с момента изобретения колеса ( "20210910130000-0500" ) «Половиной веснушки в День Размытия в Орбитальном исчислении Великого Небытия»? Явно нет, потому что тебе нужна только дата , так что веснушки не в счет.

Ответ №1:

Я думаю, что проблема заключается в форматировании datetimeoffset. Также вы, вероятно, хотите преобразовать в datetimeoffset смещение по времени для сохранения? Это работает для меня (не так красиво, но вам нужно переформатировать строку, чтобы yyyy-MM-dd hh:mm:ss-hh:mm ):

 Declare @json varchar(MAX) = ' {"stops":   {  "type": "stop",  "name": "stops",  "company_id": "xxx",  "actual_arrival": "20210910130000-0500",  "actual_departure": "20210910140000-0500"} }';  SELECT  Type, Name, CompID, CONVERT(DATETIMEOFFSET,  STUFF(STUFF(STUFF(STUFF(STUFF(STUFF(AcArrvl,  18,0,':'),  13,0,':'),  11,0,':'),  9,0,' '),  7,0,'-'),  5,0,'-') ) AcArrvl, CONVERT(DATETIMEOFFSET,  STUFF(STUFF(STUFF(STUFF(STUFF(STUFF(AcDprtr,  18,0,':'),  13,0,':'),  11,0,':'),  9,0,' '),  7,0,'-'),  5,0,'-') ) AcDprtr  FROM OPENJSON ( @json, '$.stops' )  WITH (   Type Varchar(50) '$.type',  Name Varchar(50) '$.name',  CompID Varchar(100) '$.company_id' ,  AcArrvl VARCHAR(100) '$.actual_arrival' ,  AcDprtr VARCHAR(100) '$.actual_departure') as j1