SQL- 将 varchar yyyymmdd-ttttt 转换为 iso 8601 格式

SQL- convert varchar yyyymmdd-ttttt to iso 8601 format

我正在寻找一种将 varchar yyyymmdd-ttttt 格式转换为 iso 8601 格式的方法。这是我要转换的值的示例:

20120503-56320 

我已经试过了:

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

这不会改变格式。先感谢您。

贝丝

假设格式为 YYYYMMDD- 后跟自午夜以来的秒数。

您可以通过将秒数添加到日期值来构造您想要的值:

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)))

或者(正如 Jeroen 指出的那样):

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

您也可以将其作为生成的列直接合并到 table 中:

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

这样,您就不需要在每次希望将值作为 datetime.

时复制逻辑

这里的第一个问题是您将日期时间存储为 (n)varchar。将日期和时间按原样存储 datetimedatetime(2)

当使用 CONVERT 将数据类型更改为 (n)varchar 时,提供样式代码会告诉数据引擎字符串应采用相应数据类型的格式(在本例中为 datedatetime(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;