SQL-конвертировать varchar yyyymmdd-ttttt в формат iso 8601 - PullRequest
0 голосов
/ 06 ноября 2018

Я ищу способ конвертировать varchar yyyymmdd-ttttt в iso 8601 формат. Вот пример значения, которое я хочу преобразовать:

20120503-56320 

Я уже пробовал:

CONVERT(NVARCHAR(30), ia.alcreateStamp, 126) 

, который не меняет формат. Заранее спасибо.

Бет

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Первая проблема заключается в том, что вы сохраняете дату и время как (n)varchar. Храните даты и время, такими как date, time или datetime(2).

При использовании CONVERT для изменения типа данных на (n)varchar предоставление кода стиля сообщает механизму данных формат, в котором должна быть строка, из соответствующего типа данных (в данном случае тип данных date или datetime(2)). ). Вы конвертируете nvarchar в nvarchar, поэтому код стиля полностью игнорируется.

Я догадываюсь , что значение 20120503-56320 - это дата 2012-05-03 15:34:40 (в дне 86400 секунд, и я при условии, что -56320 - секунды в дне), таким образом, чтобы преобразовать ваше значение в datetime2, вы должны использовать:

SELECT DateString,
       DATEADD(SECOND,CONVERT(int,RIGHT(V.DateString,LEN(V.DateString) - CI.I)),CONVERT(datetime2(0),LEFT(V.DateString,CI.I -1))),
       CONVERT(varchar(19),DATEADD(SECOND,CONVERT(int,RIGHT(V.DateString,LEN(V.DateString) - CI.I)),CONVERT(datetime2(0),LEFT(V.DateString,CI.I -1))),126)
FROM (VALUES('20120503-56320')) V(DateString)
     CROSS APPLY (VALUES(CHARINDEX('-',V.DateString))) CI(I);

Честно говоря, на этом этапе вы должны остановиться. Передайте значение datetime2 слою презентации и обработайте там форматирование.

Однако если вы действительно хотите улучшить, исправьте свой тип данных. Одним из методов может быть добавление нового сохраненного столбца:

ALTER TABLE YourTable ADD DateValue AS DATEADD(SECOND,CONVERT(int,RIGHT(DateString,LEN(DateString) - CHARINDEX('-',DateString))),CONVERT(datetime2(0),LEFT(DateString,CHARINDEX('-',DateString) -1))) PERSISTED;
0 голосов
/ 06 ноября 2018

Предполагается, что формат - ГГГГММДД - после количества секунд с полуночи.

Вы можете создать желаемое значение, добавив секунды к значению даты:

select dateadd(second, convert(int, right(str, 5)), convert(datetime, left(str, 8)))
from (values ('20120503-56320')) v(str)

Предполагается, что секунды заполнены нулями, поэтому «1» будет «-00001». Если это не так, используйте:

select dateadd(second, convert(int, stuff(str, 1, charindex('-', str) , '')), convert(datetime, left(str, 8)))

Или (как указывает Йерун):

select dateadd(second, convert(int, stuff(str, 1, 9, '')), convert(datetime, left(str, 8)))

Вы можете включить это непосредственно в таблицу как сгенерированный столбец:

alter table t add alcreateStamp_dt as 
    ( dateadd(second, convert(int, stuff(str, 1, charindex('-', str) , '')), convert(datetime, left(str, 8))) );

Тогда вам не нужно будет повторять логику каждый раз, когда вы хотите получить значение как datetime.

...