在TSQL中导入或转换ISO 8601日期扩展与时区数据。

问题描述 投票:0回答:3

我需要将一个平面文件导入到一个SQL Server表中,它的时间戳数据是这种格式的。

20171207T000131.000-0600

我已经导入了一个字符串,试图转换,但我没有任何运气。

sql-server tsql iso timestamp-with-timezone
3个回答
1
投票

好吧,就像我在评论中写的那样,SQL Server使用的是 DateTimeOffset 来存储时区感知的日期和时间。问题是你需要将你现在使用的无分隔符的ISO 8601格式翻译成人类可读的ISO 8601格式----。YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm],以便将该值转换为 DateTimeOffset. 你可以在需要的地方添加定界符,使用 STUFF:

Stuff 在现有的字符串中插入一个新的字符串,从指定的索引开始,而不是指定长度的现有子串。因为你不想删除原始字符串的任何现有部分,所以你使用 length 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

0
投票

如果你只需要日期,就把它作为一个字符串导入,然后执行下面的查询。

select cast(substring('20171207T000131.000-0600',1,8) as date)  

我提取'20171207'并将其转换为日期。


0
投票

试试这个

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) 
© www.soinside.com 2019 - 2024. All rights reserved.