T-SQL 计算两天之间的天数(datediff 不太有效)

Posted

技术标签:

【中文标题】T-SQL 计算两天之间的天数(datediff 不太有效)【英文标题】:T-SQL Count days between two days (datediff not quite working) 【发布时间】:2015-05-04 13:58:41 【问题描述】:

我们需要每天向客户收费。我们在当天对系统中存在的资产进行计费。所以,我从 datediff 开始...

select datediff(dd  ,'2015-04-24 12:59:32.050'  ,'2015-05-01 00:59:59.000');

返回这个:

7

但我需要计算以下日期:4/24、4/25、4/26、4/27、4/28、4/29、4/30、5/1,即 8 天。所以 datediff 不太正常。我在下面尝试了这些变化

--too simple, returns 7, i need it to return 8
select datediff(dd  ,'2015-04-24 12:59:32.050', '2015-05-01 23:59:59.000');

--looking better, this returns the 8 i need
select ceiling(datediff(hh,'2015-04-24 12:59:32.050', '2015-05-01 23:59:59.000')/24.0);

-- returns 7, even though the answer still needs to be 8. (changed enddate)
select ceiling(datediff(hh,'2015-04-24 12:59:32.050', '2015-05-01 00:59:59.000')/24.0);

所以,我的问题...如何在 SQL 中得出我所描述的日期计数,因为我相信 datediff 计算跨越的天数...。我目前最好的方法是循环遍历每一天光标和计数。艾克。

【问题讨论】:

select datediff(dd ,'2015-04-24 00:00:00.000' ,'2015-05-01 23:59:59.999'); 您认为 datediff 计算边界数的假设是正确的。如果您也想包括开始日期,您不能只在结果中添加 1 吗? select datediff(dd ,'2015-04-24 12:59:32.050', '2015-05-01 23:59:59.000') + 1; ? 【参考方案1】:

使用CONVERT去掉时间部分,加1得到想要的结果:

SELECT DATEDIFF(dd,
                CONVERT(DATE, '2015-04-24 12:59:32.050'),
                CONVERT(DATE, '2015-05-01 00:59:59.000')) + 1;

事实证明,当 dd 用作 datepart 参数时,时间部分在 DATEDIFF 中没有任何重要作用。因此,CONVERT 是多余的。这个:

SELECT DATEDIFF(dd, '2015-04-24 23:59:59.59','2015-05-01 00:00:00.000') + 1

也会返回8

【讨论】:

【参考方案2】:

你可以试试这个,它会返回 8 天。

select datediff(dd ,'2015-04-24 12:59:32.050'  ,CASE DATEDIFF(Second,'2015-05-01 00:00:00.000','2015-05-01 23:59:59.000') WHEN 0 THEN '2015-05-01 23:59:59.000' ELSE DATEADD(dd,+1,'2015-05-01 23:59:59.000') END)

如果你想为你的日期使用变量,那么这样的事情会起作用。

BEGIN
  DECLARE @StartDate DATETIME
  DECLARE @EndDate DATETIME
  DECLARE @EndDateOnly DATE
  SET @StartDate = '2015-04-24 12:59:32.050'
  SET @EndDate = '2015-05-01 23:59:59.000'
  SET @EndDateOnly = CAST(@EndDate AS DATE)

  SELECT datediff(dd ,@StartDate  ,CASE DATEDIFF(Second,CAST(@EndDateOnly||' 00:00:00.000' AS DATETIME),@EndDate) WHEN 0 THEN @EndDate ELSE DATEADD(dd,+1,@EndDate) END)
END

【讨论】:

以上是关于T-SQL 计算两天之间的天数(datediff 不太有效)的主要内容,如果未能解决你的问题,请参考以下文章

SQL 计算两个日期相差多少天数的函数

计算任意两天之间的天数

计算两天之间的天数差

两个日期之间的天数(datediff)

SQL 计算两个日期相差多少天数的函数

定义和用法 DATEDIFF() 函数返回两个日期之间的天数