将带有微秒的字符串转换为DATE

时间:2014-08-15 18:28:05

标签: sql sql-server sql-server-2008 date iso8601

我从一个应该是日期的应用程序中获取一个字符串作为输入。对于某些asinine原因,应用程序的开发人员决定提供精确到微秒。嗯,实际上,到十分之一秒。

字符串的格式为:2014-08-15T17:38:22.2930000

在他们更改此输入格式之前,我使用以下内容来转换日期。

select DATEADD(dd, 30, @Date)

我知道我可以在输入上做一个子字符串并删掉最后4个字符,但是,我想知道是否有某种方法我可以使用CONVERT来转换日期,或者如果SQL只支持具有此类精度的日期。

3 个答案:

答案 0 :(得分:3)

其中任何一个都应该有效:

SELECT CONVERT(DATE, '2014-08-15T17:38:22.2930000', 101)
SELECT CONVERT(DATETIME2, '2014-08-15T17:38:22.2930000', 101)

答案 1 :(得分:3)

哎呀,以下假定需要日期时间。在DATE替换DATETIME2将起作用,就像对CONVERT一样,时间组件被简单地删除。


CAST到DATETIME2有效(这适用于SQL Server 2008 R2 - YMMV其他地方),

select CAST('2014-08-15T17:38:22.2930001' AS DATETIME2) t;

因为DATETIME2的最大精度为100ns,或小数点后的7位数。

然后它可以转换为正常的DATETIME(explicitly or implicitly),虽然这会失去精度,

select CAST(CAST('2014-08-15T17:38:22.2930001' AS DATETIME2) AS DATETIME) t;

然而,这种精确度的损失不能直接用于CHAR - > DATETIME施放,并且其他演员阵容有精确的公差。

select CAST('2014-08-15T17:38:22.293' AS DATETIME) t;         -- OK*
select CAST('2014-08-15T17:38:22.2930' AS DATETIME) t;        -- fail
-- although a cast to DATETIME2 is happy to lose some precision
select CAST('2014-08-15T17:38:22.2930001' AS DATETIME2) t;    -- OK, no loss
select CAST('2014-08-15T17:38:22.29300014' AS DATETIME2) t;   -- OK, loss
select CAST('2014-08-15T17:38:22.293000144' AS DATETIME2) t;  -- OK, loss
select CAST('2014-08-15T17:38:22.2930001444' AS DATETIME2) t; -- fail
-- and a cast to DATE works up to 8 digits after the decimal
select CAST('2014-08-15T17:38:22.29300014' AS DATE) t;        -- OK, date only
select CAST('2014-08-15T17:38:22.293000144' AS DATE) t;       -- fail

* DATETIME的精度为3位十进制数,但精度不高。

据我所知,CHAR的相同规则 - > DATETIME / DATETIME2适用于COVERT,失去最大精度仍然会导致错误。


ISO 8601标准对精度没有限制,但“通信方需要同意小数位数”。

答案 2 :(得分:2)

SELECT CAST('2014-08-15T17:38:22.2930000' AS DATETIME2) 

RESULT:  2014-08-15 17:38:22.2930000

现在因为它是sql server中的有效日期时间值,所以您可以访问所有日期时间函数,就像您在问题中提到的那样DATEADD()

Datetime2为您提供比简单日期时间数据类型更高的精度,了解有关DATETIME2数据类型here的更多信息。