Первая проблема заключается в том, что вы сохраняете дату и время как (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;