【问题标题】:Return DATEDIFF in milliseconds on SQL Server 2008R2在 SQL Server 2008R2 上以毫秒为单位返回 DATEDIFF
【发布时间】:2019-08-27 11:31:55
【问题描述】:

我有一个 SQL 查询返回 x 的值,它是一个时间戳,映射到类型为 long 的 C# 对象:

SELECT DATEDIFF(second, { d '1970-01-01'}, dateCompleted) AS x

上述语句有效。但是,我需要获取时间戳以以毫秒而不是秒为单位返回值。在 SQL Server 2016 中,我可以这样做:

SELECT DATEDIFF_BIG(millisecond, { d '1970-01-01'}, dateCompleted) AS x

...效果很好。但是,我被困在 SQL Server 2008 R2 上。

我可以返回这些值并在 C# 中进行一些后处理以将 x 乘以 1000,但我想知道是否有办法在查询本身中处理这个问题。我尝试了一个简单的乘法,但会产生 算术溢出错误

SELECT DATEDIFF(second, { d '1970-01-01'}, dateCompleted) * 1000 AS x

谁能建议如何做到这一点?

谢谢。

【问题讨论】:

  • * 1000.0 AS x

标签: sql sql-server date sql-server-2008-r2 timestamp


【解决方案1】:

使用cast()convert() 怎么样?

SELECT DATEDIFF(second,{ d '1970-01-01'},dateCompleted) * convert(bigint, 1000) AS x

【讨论】:

    【解决方案2】:

    也许是一个变量?

    DECLARE @milli BIGINT;
    
    SET @milli = DATEDIFF(second,{ d '1970-01-01'},dateCompleted) * 1000.0;
    
    SELECT @milli;
    

    【讨论】:

      【解决方案3】:

      Datediff 返回 int 值,因此第二个将有 int 数据类型的问题。

      你可以得到分钟或天数和倍数,60 得到秒数

      SELECT DATEDIFF(m,{ d '1970-01-01'},getdate()) * 1000 * 60

      【讨论】:

        【解决方案4】:

        DATEDIFF 返回一个 INT,因此如果两个日期相距很远(大约 25 天),它不能用于返回以毫秒为单位的差异。但是,您可以计算以秒为单位的差异,将 BIGINT 乘以 1000,然后加上毫秒:

        SELECT DATEDIFF(SECOND, '1970-01-01', dateCompleted)
             * CAST(1000 AS BIGINT)
             + DATEPART(MILLISECOND, dateCompleted)
        

        假设您想要 UNIX 时间戳,您还需要将时区偏移量添加到结果中(我希望您将它与完成日期一起存储)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-16
          • 2011-08-02
          • 2018-01-30
          • 1970-01-01
          • 2010-10-30
          • 1970-01-01
          • 1970-01-01
          • 2016-01-27
          相关资源
          最近更新 更多