这个时差计算如何工作?

时间:2017-12-12 22:29:52

标签: tsql sql-server-2014 datediff

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

我在Stack Overflow post找到了一个解决方案。而且效果很好。但我想了解这是如何得出正确答案的“原因”。

T-SQL:

datetime

结果:

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;

客户ID中的第一列 - 第二列和第三列是我想要计算时间差的列。第三列是两列之间的差异 - 以及我不理解的代码中的一个点。

如果你减去这个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 这两个datetime字段,为什么它会默认为1900年?

关于create date - harvestdate - 0是什么意思? 0是否将日期设置为'01 -01-1900'?

它有效 - 为此我感激不尽。我希望我能解释为什么这种行为会起作用?

1 个答案:

答案 0 :(得分:1)

我添加了一些可以解释它的评论:

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;