使用 SQL Server 2008,我想计算给定日期范围内 16:30 到 18:00 之间的分钟数。
因此输入例如 @fromdate = '2017-04-17 17:00:00' 和 @todate = '2017-04-19 17:00:00'
因此,对于上面使用拉门数学的示例。
Day 1 (17th) : 60
Day 2 (18th) : 90
Day 3 (19th) : 30
Total 180
第 1 天为 60,因为开始日期 17:00 到 18:00 之间有 60 分钟 第 2 天为 90,因为中间日期必须是 16:30 到 18:00 之间的完整 90 分钟 第 3 天为 30,因为16:30 到 17:00(结束日期的时间)之间有 30 分钟,因此我正在搜索每天 16:30 到 18:00 之间的分钟数(如果有意义的话)。
我希望总数成为输出。
最佳答案
这将在 SQL Server 中工作。我们在 cte 中填充开始和结束日期时间。之后,就像以分钟为单位计算日期差一样简单:
declare @fromdate datetime = convert(datetime,'2017-04-17 17:00:00',20)
declare @todate datetime = convert(datetime,'2017-04-19 17:00:00',20)
declare @startRangeTime time = '16:30';
declare @endRangeTime time = '18:00';
with dates as (
select top (datediff(day, @fromdate, @toDate) + 1)
case when dateadd(day,row_number() over (order by a.object_id) - 1, cast(@fromdate as date)) = cast(@fromdate as date)
then @fromdate
else cast(dateadd(day,row_number() over (order by a.object_id) - 1, cast(@fromdate as date)) as datetime) + cast(@startRangeTime as datetime)
end as startDt,
case when dateadd(day,row_number() over (order by a.object_id) - 1, cast(@fromdate as date)) = cast(@todate as date)
then @todate
else cast(dateadd(day,row_number() over (order by a.object_id) - 1, cast(@fromdate as date)) as datetime) + cast(@endRangeTime as datetime)
end as endDt
from sys.all_objects a
cross join sys.all_objects b
)
select sum(datediff(mi, startDt, endDt)) from dates
返回:
180
生成不带循环的日期,取自本系列 generating a sequence without loops
关于sql - 计算日期范围内两次之间的分钟数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43494797/