sql-server - 创建一个 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
谢谢你看我的问题
解决方案
首先,您需要一个日历表来返回间隔内的天数。你可能已经有了一个,如果没有的话,我已经用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)
在网上看到
推荐阅读
- openshift - Openshift/minishift Nodejs 应用程序构建错误“找不到 javac”
- java - 列出远程服务器目录中的文件名
- react-native - react-native-image-picker 减少文件的大小和质量
- python - 未知 python 错误调用另一个类中的方法“无法记录错误”
- html - simple_form 嵌套 json 属性
- react-native - 无法使用 flatlist 列出数据
- javascript - 键盘交互后未立即注册鼠标单击
- java - 将文件写入 Android 8.1.0 及更高版本?
- javascript - 禁用 Angular 组件
- ios - 用于以任何出现顺序匹配具有多个单词的列中的字符串的 Coredata 谓词