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 不太有效)的主要内容,如果未能解决你的问题,请参考以下文章