如何将 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 和位问题

将 datetime2 数据类型转换为 datetime 数据类型导致值超出范围 - 未使用 DateTime2

MS-Access 将 SQL 服务器 datetime2 字段视为 TEXT