自1970年以来将Sql Server DateTime转换为毫秒

use*_*908 6 sql-server

我想将sql server datetime转换为毫秒。我试图用datediff函数将其转换如下:

select cast(Datediff(ms, '1970-01-01',GETUTCDATE()) AS bigint)
Run Code Online (Sandbox Code Playgroud)

但这给了我这个错误:

消息535,级别16,状态0,第2行datediff函数导致溢出。分隔两个日期/时间实例的日期部分的数量太大。尝试将datediff与不太精确的datepart一起使用。

我不想这样:

select cast(Datediff(minute, '1970-01-01',GETUTCDATE()) AS bigint)*60*1000
Run Code Online (Sandbox Code Playgroud)

因为它不会给我准确的结果。有人可以帮我吗?

小智 9

对于仍在寻找它的人们,可以使用DATEDIFF_BIG函数。在SQL 2016 +,Azure中支持

https://docs.microsoft.com/zh-cn/sql/t-sql/functions/datediff-big-transact-sql

  • 例如 `SELECT DATEDIFF_BIG(MILLISECOND, '1970-01-01', GETDATE());` (4认同)

Mis*_*ise 8

使用此查询,您可以获得自 1970 年以来的日期时间到毫秒数

SELECT CAST(Datediff(s, '1970-01-01', GETUTCDATE()) AS BIGINT)*1000
Run Code Online (Sandbox Code Playgroud)


Tim*_*ers 3

您确定需要将其精确到毫秒(千分之一秒)吗?

请注意,1 天 = 86,400,000 毫秒(是的,8640 万)

1 年 = 约 316 亿毫秒。

1970 年是(截至今天)44 年前,所以大约是 1.4 万亿毫秒前。

当然,一个 bigint 可以处理它,不幸的是你也达到了 的限制DATEDIFF,这是文档中的引用:

如果返回值超出 int 范围(-2,147,483,648 到 +2,147,483,647),则返回错误。对于毫秒,startdate 和 enddate 之间的最大差异为 24 天 20 小时 31 分钟 23.647 秒。其次,最大差距为68岁。

因此,您可以安全地在一段时间内获得以秒为单位的差异(只要您不走得太远),然后您可以从今天开始计算毫秒,例如:

SELECT 
  CAST(DATEDIFF(second, '1970-01-01', CAST(GetUtcDate() AS date)) AS bigint)
    AS [SecondsToStartOfDay], 
  DATEDIFF(ms, CAST(GetUtcDate() AS date), GetUtcDate())
    AS [MillisecondsSinceStartOfDay],
  (CAST(DATEDIFF(second, '1970-01-01', CAST(GetUtcDate() AS date)) AS bigint)*1000) 
  + DATEDIFF(ms, CAST(GetUtcDate() AS date), GetUtcDate()) 
    AS [Milliseconds]
Run Code Online (Sandbox Code Playgroud)

前两列仅显示所涉及的步骤。

  • `GetUtcDate()` 的当前值可以保存到一个变量中,然后在出现问题时重新使用。 (2认同)