在 SQL Server 2008R2 上以毫秒为单位返回 DATEDIFF

Posted

技术标签:

【中文标题】在 SQL Server 2008R2 上以毫秒为单位返回 DATEDIFF【英文标题】:Return DATEDIFF in milliseconds on SQL Server 2008R2 【发布时间】: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 【参考方案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 时间戳,您还需要将时区偏移量添加到结果中(我希望您将它与完成日期一起存储)。

【讨论】:

以上是关于在 SQL Server 2008R2 上以毫秒为单位返回 DATEDIFF的主要内容,如果未能解决你的问题,请参考以下文章

windows server 2008r2可以安装sql server2012吗

SQL server 2008R2中怎么直接修改表内数据

win10 下安装SQL server 2008R2 express

简述2012版SQL SERVER备份还原到2008R2版SQL SERVER的方法(转载)

VS2010 数据库项目和 SQL Server 2008R2

cwRsync实现windows下文件定时同步(sql server 2008R2 备份文件定时同步)