我需要将一个平面文件导入到一个SQL Server表中,它的时间戳数据是这种格式的。
20171207T000131.000-0600
我已经导入了一个字符串,试图转换,但我没有任何运气。
好吧,就像我在评论中写的那样,SQL Server使用的是 DateTimeOffset
来存储时区感知的日期和时间。问题是你需要将你现在使用的无分隔符的ISO 8601格式翻译成人类可读的ISO 8601格式----。YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm]
,以便将该值转换为 DateTimeOffset
. 你可以在需要的地方添加定界符,使用 STUFF
:
Stuff 在现有的字符串中插入一个新的字符串,从指定的索引开始,而不是指定长度的现有子串。因为你不想删除原始字符串的任何现有部分,所以你使用 length 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
如果你只需要日期,就把它作为一个字符串导入,然后执行下面的查询。
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)