在 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.

我还在我的演示中添加了将数据转换为 datedatetime2 的方法建议(不是 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