我从一个应该是日期的应用程序中获取一个字符串作为输入。对于某些asinine原因,应用程序的开发人员决定提供精确到微秒。嗯,实际上,到十分之一秒。
字符串的格式为:2014-08-15T17:38:22.2930000
在他们更改此输入格式之前,我使用以下内容来转换日期。
select DATEADD(dd, 30, @Date)
我知道我可以在输入上做一个子字符串并删掉最后4个字符,但是,我想知道是否有某种方法我可以使用CONVERT
来转换日期,或者如果SQL只支持具有此类精度的日期。
答案 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
的更多信息。