如何将 sql datetime2 转换为加倍?
Posted
技术标签:
【中文标题】如何将 sql datetime2 转换为加倍?【英文标题】:How to cast sql datetime2 to double? 【发布时间】:2018-09-20 09:26:41 【问题描述】:我在 SQL Server 2016 中有一个表,其中有一列名为“开始”,类型为 datetime2(0)。在从该表中提取数据的应用程序中,我需要将该列数据转换为双精度数据(我正在使用要求数据为双精度数组的第三方应用程序)。我试图以这种方式将数据转换为字符串以将其传递给我的应用程序:
SELECT Cast(Start AS CHAR(19)) FROM MyTable
然后在我的应用程序中将该字符串转换为双精度。这种方法不起作用,因为我无法将字符串转换为双精度。有什么好的方法?
【问题讨论】:
【参考方案1】:我假设你的意思是浮点数。
datetime2(0) 可以先转换为日期时间(不损失精度),这很容易转换为浮动 假设您在 1753 年之前没有值
SELECT CAST(CAST(Start AS datetime) AS float) FROM MyTable
例子
DECLARE @foo datetime2(0) = GETDATE()
SELECT @foo, CAST(CAST(@foo AS datetime) AS float)
-- 2018-09-20 11:31:32 43361.4802314815
GO
DECLARE @foo datetime2(0) = GETDATE()
SELECT @foo, CAST(@foo AS float) --error
--Msg 529, Level 16, State 2, Line 5
--Explicit conversion from data type datetime2 to float is not allowed.
【讨论】:
【参考方案2】:如果您确实需要使用 1753 年之前的日期,您可以使用 DateDiff_Big 从固定时间点计算秒数,然后除以一天中的秒数。
DateDiff_Big 仅在 SQL Server 2016 之后可用。如果您有早期版本,您可以使用 DateDiff 执行类似的操作,但稍微复杂一些。
declare @x datetime2(0)
set @x = '2018-09-20T22:44:07'
select @x,
cast ( cast ( @x as datetime ) as float ),
datediff_big(second,'0001-01-01T00:00:00.000', @x ) / cast(86400 as float) - 693595,
( datediff ( day, '0001-01-01T00:00:00.000', @x ) + datediff ( second, '00:00:00.000', cast(@x as time) ) / cast(86400 as float) ) - 693595
set @x = '1804-09-20T08:35:00'
select @x,
cast ( cast ( @x as datetime ) as float ),
datediff_big(second,'0001-01-01T00:00:00.000', @x ) / cast(86400 as float) - 693595,
( datediff ( day, '0001-01-01T00:00:00.000', @x ) + datediff ( second, '00:00:00.000', cast(@x as time) ) / cast(86400 as float) ) - 693595
set @x = '1066-09-20T08:35:00'
select @x,
-- cast ( cast ( @x as datetime ) as float ), -- won't work, before 1753.
datediff_big(second,'0001-01-01T00:00:00.000', @x ) / cast(86400 as float) - 693595,
( datediff ( day, '0001-01-01T00:00:00.000', @x ) + datediff ( second, '00:00:00.000', cast(@x as time) ) / cast(86400 as float) ) - 693595
【讨论】:
以上是关于如何将 sql datetime2 转换为加倍?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 varchar 日期转换为 datetime2 日期
如何识别列抛出 System.Data.SqlClient.SqlException? (将 datetime2 数据类型转换为 datetime 数据类型)
在 sql server 中将 varchar yyyy-mm-dd T hh:mm 转换为 datetime2
将 XML 解析为 sql 参数、datetime2 和位问题