2015-05-04 70 views
0

我们有要求每天向我们的客户开票的要求。我们在我们的系统当天的账单中存在资产存在。于是,我开始用DATEDIFF ...T-SQL计算两天之间的天数(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计数跨越时间界限的数量....我当前最好的方法是循环遍历游标和计数。伊克。

+0

select datediff(dd,'2015-04-24 00:00:00.000','2015-05-01 23:59:59.999'); – Lali

+0

您使用datediff计算边界的数量是正确的。如果你想包含开始日期,你不能只加1结果? 'select datediff(dd,'2015-04-24 12:59:32.050','2015-05-01 23:59:59.000')+ 1;'? – jpw

回答

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; 

原来的时间部分时dd用作DATEDIFF没有发挥任何显著的作用datepart的说法。因此,CONVERT是多余的。此:

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

也将返回8以及。

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