1

我正在尝试获取两个 DateTime 值之间的 DateTime 差异。

查询我到目前为止,

DECLARE @start datetime = '2012-01-01 12:00:00.000'
DECLARE @end datetime =  '2013-01-01 11:59:59.999'

SELECT 
      CONVERT(VARCHAR(5),DATEDIFF(YYYY, @start, @end))
+'-'+ CONVERT(VARCHAR(5),DATEDIFF(MONTH, @start, @end))
+'-'+ CONVERT(VARCHAR(5),DATEDIFF(SECOND, @start, @end)/86400)
+' '+ CONVERT(VARCHAR(5),DATEDIFF(SECOND, @start, @end)%86400/3600)
+':'+ CONVERT(VARCHAR(5),DATEDIFF(SECOND, @start, @end)%3600/60)
+':'+ CONVERT(VARCHAR(5),(DATEDIFF(SECOND, @start, @end)%60)) 
+'.'+ CONVERT(VARCHAR(5),(DATEDIFF(SECOND, @start, @end)%100))
AS [YYYY-MM-DD HH:MM:SS.MSS]

期望的输出

0001-00-00 23:59:59.999
365 Days, 23 Hours, 59 Minutes, 59 Seconds, 999 Milliseconds

实际输出

1-12-366 8784:0:0.0

谢谢

4

2 回答 2

5

日期时间精度四舍五入到 0.000、0.003 或 0.007 秒的增量。为了获得更好的准确性,请使用DateTime2数据类型。

DECLARE @start datetime2 = '2012-01-01 12:00:00.000'
DECLARE @end datetime2 =  '2013-01-01 11:59:59.999'

--I do this way because millisecond difference overflows the integer.
select datediff(day, @start, @end) days,
       datediff(millisecond, convert(time, @start), convert(time, @end)) milliseconds

结果和小提琴演示

   days | milliseconds
   366  | -1

以上结果意味着您可以获得所需的结果:

  (366 days - 1 millisecond) =  
   365 Days, 23 Hours, 59 Minutes, 59 Seconds, 999 Milliseconds

编辑:请注意,给定两个日期之间的毫秒差太高,实际上也溢出了 bigint。所以我用这个方法 来得到你预期的答案。

于 2013-10-17T20:53:11.010 回答
1

我不得不更改开始和结束,似乎 SQL Server 在它是 0.999 时对其进行了四舍五入。

DECLARE @start datetime = '2012-01-01 00:00:00.000'
DECLARE @end datetime =  '2013-01-01 23:59:59.997'

SELECT 
      CONVERT(VARCHAR(5),DATEDIFF(YYYY, @start, @end))
+'-'+ CONVERT(VARCHAR(5),DATEPART(mm, @Start) - DATEPART(mm, @End))
+'-'+ CONVERT(VARCHAR(5),DATEPART(dd, @Start) - DATEPART(mm, @End))
+' '+ CONVERT(VARCHAR(5),DATEPART(hh, @Start) - DATEPART(hh, @End))
+':'+ CONVERT(VARCHAR(5),DATEPART(mi, @Start) - DATEPART(mi, @End))
+':'+ CONVERT(VARCHAR(5),DATEPART(ss, @Start) - DATEPART(ss, @End))
+'.'+ CONVERT(VARCHAR(5),DATEPART(ms, @Start) - DATEPART(ms, @End))
AS [YYYY-MM-DD HH:MM:SS.MSS]
于 2013-10-17T20:48:42.077 回答