两天之间的T-SQL计数天数(datediff不太正常)

时间:2015-05-04 13:58:41

标签: sql-server tsql 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天。因此,约瑟夫并不是很正常。我尝试了下面的这些变化

--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中,我将如何得出像我所描述的日期计数,因为我相信dateiff会计算跨越日界限的数量....我目前的最佳方法是每天都在循环光标和计数。 ICK。

2 个答案:

答案 0 :(得分:2)

使用CONVERT删除时间部分,添加1以获得所需结果:

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

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

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

也会返回8

答案 1 :(得分:0)

您可以尝试这将返回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