【问题标题】:How to cast sql datetime2 to double?如何将 sql datetime2 转换为加倍?
【发布时间】:2018-09-20 09:26:41
【问题描述】:

我在 SQL Server 2016 中有一个表,其中有一列名为“开始”,类型为 datetime2(0)。在从该表中提取数据的应用程序中,我需要将该列数据转换为双精度数据(我正在使用要求数据为双精度数组的第三方应用程序)。我试图以这种方式将数据转换为字符串以将其传递给我的应用程序:

SELECT Cast(Start AS CHAR(19)) FROM MyTable

然后在我的应用程序中将该字符串转换为双精度。这种方法不起作用,因为我无法将字符串转换为双精度。有什么好的方法?

【问题讨论】:

    标签: sql-server data-conversion


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-20
        • 2019-04-16
        • 1970-01-01
        • 2014-09-12
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多