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
。将日期和时间按原样存储 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;
我正在寻找一种将 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
。将日期和时间按原样存储 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;