我们要求每天向客户收费。我们在当天的系统中记录资产的存在。所以,我从约会开始......
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。
答案 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