在 SQL 中导入或转换使用时区数据扩展的 ISO 8601 日期
Import or convert an ISO 8601 date extended with timezone data in TSQL
我需要将一个平面文件导入 SQL 服务器 table 并且它具有以下格式的时间戳数据:
20171207T000131.000-0600
我已经导入为字符串,尝试转换,但我没有任何运气。
如果您只需要日期,将其作为字符串导入并执行以下查询
select cast(substring('20171207T000131.000-0600',1,8) as date)
我正在提取“20171207”并将其转换为日期
试试这个:
SELECT CONVERT(DATETIME,
STUFF(STUFF(STUFF(STUFF(STUFF(STUFF('20171207T000131.000-0600',20,5,''),14,0,':'),12,0,':'),9,1,' '),7,0,'-'),5,0,'-'),120)
好吧,正如我在评论中所写,SQL 服务器使用 DateTimeOffset
来存储时区感知日期和时间。
问题是您需要将现在使用的无定界符 ISO 8601 格式转换为 ISO 8601 格式的人类可读版本 - YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm]
,以便将该值转换为 DateTimeOffset
.
您可以通过使用 STUFF
:
在需要的地方添加定界符来做到这一点
Stuff 将新字符串插入现有字符串,从指定索引开始,而不是指定长度的现有子字符串。由于您不想删除原始字符串的任何现有部分,因此使用长度 0
.
我还在我的演示中添加了将数据转换为 date
和 datetime2
的方法建议(不是 DateTime
、!),在如果您不需要准确的信息(仅时区就可以轻松说明日期更改):
DECLARE @DTOString varchar(100) = '20171207T000131.000-0600'
SELECT CAST(LEFT(@DTOString, 8) As Date) As [Date],
CAST(
STUFF(
STUFF(
STUFF(
LEFT(@DTOString,19)
, 14, 0, ':')
, 12, 0, ':')
,9, 1, ' ') -- Replacing the T with a space
As DateTime2) AS [DateTime2], -- NOT to DateTime! there's a bug!
CAST(
STUFF(
STUFF(
STUFF(
STUFF(
STUFF(@DTOString, 23, 0, ':')
, 14, 0, ':')
, 12, 0, ':')
, 7, 0, '-')
, 5, 0, '-')
As DateTimeOffset) As [DateTimeOffset]
结果:
Date DateTime2 DateTimeOffset
07.12.2017 07.12.2017 00:01:31 07.12.2017 00:01:31 -06:00
我需要将一个平面文件导入 SQL 服务器 table 并且它具有以下格式的时间戳数据:
20171207T000131.000-0600
我已经导入为字符串,尝试转换,但我没有任何运气。
如果您只需要日期,将其作为字符串导入并执行以下查询
select cast(substring('20171207T000131.000-0600',1,8) as date)
我正在提取“20171207”并将其转换为日期
试试这个:
SELECT CONVERT(DATETIME,
STUFF(STUFF(STUFF(STUFF(STUFF(STUFF('20171207T000131.000-0600',20,5,''),14,0,':'),12,0,':'),9,1,' '),7,0,'-'),5,0,'-'),120)
好吧,正如我在评论中所写,SQL 服务器使用 DateTimeOffset
来存储时区感知日期和时间。
问题是您需要将现在使用的无定界符 ISO 8601 格式转换为 ISO 8601 格式的人类可读版本 - YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm]
,以便将该值转换为 DateTimeOffset
.
您可以通过使用 STUFF
:
Stuff 将新字符串插入现有字符串,从指定索引开始,而不是指定长度的现有子字符串。由于您不想删除原始字符串的任何现有部分,因此使用长度 0
.
我还在我的演示中添加了将数据转换为 date
和 datetime2
的方法建议(不是 DateTime
、
DECLARE @DTOString varchar(100) = '20171207T000131.000-0600'
SELECT CAST(LEFT(@DTOString, 8) As Date) As [Date],
CAST(
STUFF(
STUFF(
STUFF(
LEFT(@DTOString,19)
, 14, 0, ':')
, 12, 0, ':')
,9, 1, ' ') -- Replacing the T with a space
As DateTime2) AS [DateTime2], -- NOT to DateTime! there's a bug!
CAST(
STUFF(
STUFF(
STUFF(
STUFF(
STUFF(@DTOString, 23, 0, ':')
, 14, 0, ':')
, 12, 0, ':')
, 7, 0, '-')
, 5, 0, '-')
As DateTimeOffset) As [DateTimeOffset]
结果:
Date DateTime2 DateTimeOffset
07.12.2017 07.12.2017 00:01:31 07.12.2017 00:01:31 -06:00