首页 > 解决方案 > 创建一个 Select 语句,该语句确定 2 个日期之间的持续时间,拆分为 2 个日期中的每个日期

问题描述

我有一个包含以下列的记录的表:Taskname、Start_Date、End_Date

我需要添加一个新列来显示 Start_Date 和 End_Date 之间的持续时间。如果任务重叠多天,我需要为每个日期创建一个持续时间拆分

例子:

开始日期 = 2020 年 4 月 6 日 23:45:00 结束日期 = 2020 年 5 月 6 日 00:00:16

结果 2 条记录显示每一天的持续时间:

4-6-2020   15
5-6-2020   16

谢谢你看我的问题

标签: sql-server

解决方案


首先,您需要一个日历表来返回间隔内的天数。你可能已经有了一个,如果没有的话,我已经用CTE作为日历做了一个例子。

之后,我们返回一个 UNION,如果它们在同一天,则返回 Start_Date 以及 Start_Date 和 End_Date 之间的分钟数,或者直到第二天的分钟数。添加间隔的完整天数(Start_Date + 1 和 End_Date -1 内的天数),每个天数为 24 * 60 分钟。最后添加 End_Date 与前一天的分钟,当它与 Start_Date 不同的一天

create table MyLog (Start_Date datetime, End_Date datetime)
insert into MyLog (Start_Date, End_Date)
            values ('2020-06-04 23:45', '2020-06-05 00:16')

declare @Start_Date date = (select min(Start_Date) from MyLog)
declare @End_Date date = (select max(End_Date) from MyLog)

;
with CTE as (
  select @Start_Date as date
  union all
  select dateadd(day, 1, date) as date
  from CTE 
  where date < @End_Date
)
select convert(date, Start_Date) as date,
       case when convert(date, Start_Date) = convert(date, End_Date) then datediff(minute, Start_Date, End_Date)
            else datediff(minute, Start_Date, dateadd(day, 1, convert(date, Start_Date)))
       end as minutes
from MyLog
union all
select CTE.date, 
        24 * 60 as minutes
from MyLog
     inner join CTE on CTE.date between dateadd(day, 1, convert(date, Start_Date)) and dateadd(day, -1, convert(date, End_Date))
union all
select convert(date, End_Date) as date,
        datediff(minute, convert(date, End_Date), End_Date) as minutes
from MyLog
where convert(date, Start_Date) <> convert(date, End_Date)

在网上看到


推荐阅读