#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