2014-11-04 144 views
11

我有以下的查询时:SQL服务器:DATEDIFF函数导致溢出采用多段微差

select CONVERT(varchar(12), DATEADD(MILLISECOND, DateDiff(MILLISECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114) 

当我执行此,我得到的错误: “DateDiff函数导致溢出的数量dateparts分隔两个日期/时间实例太大,尝试使用datediff与不太精确的datepart。“

当我查询更改为以下正常工作:

select CONVERT(varchar(12), DATEADD(SECOND, DateDiff(SECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114) 

的问题是,我真的需要毫秒为好。

+2

DATEDIFF返回一个整数,它不足以保存结果。我能想到的唯一方法就是计算两个日期之间有多少天,然后仅对两个日期的时间部分进行比较,以计算出有多少毫秒的差异,然后将两者相加(将天数乘以一天中的毫秒数)。 – Alan 2014-11-04 08:05:45

+1

备注:您是否在适用某种夏令时的地区工作?因为在很多地方,在您查看期间DST开/关之间存在转换,而SQL Server不会考虑它。所以你可以得到一个精确到毫秒但是整整一个小时的结果。 – 2014-11-04 08:16:32

+0

做了任何答案解决您的问题?如果是这样,请接受 – 2014-11-05 10:43:58

回答

3

您不需要在计算中引用毫秒。

这将做完全一样的,只是溢出脚本:

SELECT CONVERT(varchar(12), 
     CAST('2014-11-04 08:21:17.723' as datetime) - 
     CAST('2014-08-04 10:37:28.713' as datetime) 
     , 114) 
12

过了一会响应,但可能会有帮助。 在SQL 2016中,MS推出了函数DATEDIFF_BIG,它将根据类型大小溢出的差异比290k年更大。但是TechNet文章有相同的时间差基本DATEDIFF - https://msdn.microsoft.com/en-us/library/mt628058.aspx

+0

太棒了,2016年我还没有意识到这一点。我们早点开始使用它,但很高兴知道它在地平线上:) – defines 2016-07-27 18:09:56

2

对我有,所以我使用了下面的代码两个日期之间的间隔大

声明@timetagInMillsecond BIGINT = CAST(CAST(CAST(@时标为 日期时间)-'1970-01-01' 为十进制(38,10))* 24 * 60 * 60 * 1000 + 0.5作为 BIGINT)

这对我的作品。