sql - 计算日期范围内两次之间的分钟数

标签 sql sql-server datetime sql-server-2008-r2

使用 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/

相关文章:

mysql联合还是加入?

sql - postgresql 合并文本[]

sql - 虚拟驱动器上的 MDF、LDF 文件

python - 如何根据 Pandas 时间序列中的 5 分钟间隔创建组 ID?

mysql - 将值以 x 开头的行排序在包含 x 的行之前

sql - Microsoft SQL Server 查询改进

c# - 将数据从文本框存储到 appconfig 中

python - 实时获取 SQL Server 更新的好方法是什么?

scala - 在 Zeppelin 和 Spark 中解析 CSV 中的日期时间信息

java - 如何使用 java 8 从日期时间间隔中获取析取