这个时差计算是如何工作的?

How does this Time Difference Calculation work?

我想显示 SQL Server 2014 中两个 datetime 字段之间 HH:MM:SS 的差异。

我在这个 Stack Overflow post 中找到了解决方案。它完美地工作。但我想了解 "why" 这是如何得出正确答案的。

T-SQL:

SELECT y.CustomerID ,
   y.createDate ,
   y.HarvestDate ,
   y.DateDif ,
   DATEDIFF ( DAY, 0, y.DateDif ) AS [Days] ,
   DATEPART ( HOUR, y.DateDif ) AS [Hours] ,
   DATEPART ( MINUTE, y.DateDif ) AS [Minutes]
FROM   (
       SELECT x.createDate - x.HarvestDate AS [DateDif] ,
              x.createDate ,
              x.HarvestDate ,
              x.CustomerID
       FROM   (
                  SELECT CustomerID ,
                         HarvestDate ,
                         createDate
                  FROM   dbo.CustomerHarvestReports
                  WHERE  HarvestDate >= DATEADD ( MONTH, -6, GETDATE ())
              ) AS [x]
   ) AS [y]
ORDER BY DATEDIFF ( DAY, 0, y.DateDif ) DESC;

结果:

1239090  2017-11-07 08:51:03.870  2017-10-14 11:39:49.540  1900-01-24 21:11:14.330  23  21  11
1239090  2017-11-07 08:51:04.823  2017-10-19 11:17:48.320  1900-01-19 21:33:16.503  18  21  33
1843212  2017-10-27 19:14:02.070  2017-10-21 10:49:57.733  1900-01-07 08:24:04.337  6   8   24
1843212  2017-10-27 19:14:03.057  2017-10-21 10:49:57.733  1900-01-07 08:24:05.323  6   8   24

第一列Customer ID - 第二列和第三列是我要计算时间差的列。第三列是两列的区别——也是代码中我看不懂的地方之一。

如果像这样减去两个 datetime 字段 create date - harvestdate,为什么默认为 1900 年?

关于 DATEDIFF ( DAY, 0 , y.DateDiff) - 0 是什么意思? 0 是否将日期设置为“01-01-1900”?

它有效 - 为此我很感激。我希望我能得到有关此行为为何有效的解释?

我添加了一些应该解释它的评论:

SELECT y.CustomerID ,
   y.createDate ,
   y.HarvestDate ,
   y.DateDif ,
   DATEDIFF ( DAY, 0, y.DateDif ) AS [Days] , -- calculates the number of whole days between 0 and the difference

   DATEPART ( HOUR, y.DateDif ) AS [Hours] , -- the number of hours between the two dates has already been cleverly
                                             -- calculated in [DateDif], therefore, all that is required is to extract
                                             -- that figure using DATEPART

   DATEPART ( MINUTE, y.DateDif ) AS [Minutes] -- same explanation as [Hours]
FROM   (
       SELECT x.createDate - x.HarvestDate AS [DateDif] , -- calculates the difference expressed as a datetime;
                                                          -- 0 is '1900-01-01 00:00:00.000' as a datetime, so the
                                                          -- resulting datetime will be that plus the difference
              x.createDate ,
              x.HarvestDate ,
              x.CustomerID
       FROM   (
                  SELECT CustomerID ,
                         HarvestDate ,
                         createDate
                  FROM   dbo.CustomerHarvestReports
                  WHERE  HarvestDate >= DATEADD ( MONTH, -6, GETDATE ())
              ) AS [x]
   ) AS [y]
ORDER BY DATEDIFF ( DAY, 0, y.DateDif ) DESC;