我想将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
使用此查询,您可以获得自 1970 年以来的日期时间到毫秒数
SELECT CAST(Datediff(s, '1970-01-01', GETUTCDATE()) AS BIGINT)*1000
Run Code Online (Sandbox Code Playgroud)
您确定需要将其精确到毫秒(千分之一秒)吗?
请注意,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)
前两列仅显示所涉及的步骤。
| 归档时间: |
|
| 查看次数: |
32400 次 |
| 最近记录: |