我有一个保存车辆活动数据的表。表格中有开始日期和结束日期列。我希望构造一个查询,以分钟为单位显示每辆车在特定日期处于活动状态或工作的时间。我的问题是,开始日期和结束日期之间的时间可能会跨越几天。
示例:
dwVehicleIDFK StartDate EndDate Minutes HrsMins
731 18/09/2019 08:00 18/09/2019 13:00 300 05:00
797 18/09/2019 08:00 18/09/2019 12:00 240 04:00
687 17/09/2019 16:00 17/09/2019 21:00 300 05:00
826 17/09/2019 16:00 17/09/2019 21:00 300 05:00
734 18/09/2019 10:00 18/09/2019 15:30 330 05:30
843 18/09/2019 14:00 18/09/2019 18:00 240 04:00
662 18/09/2019 09:00 18/09/2019 14:00 300 05:00
662 17/09/2019 09:00 17/09/2019 14:00 300 05:00
662 16/09/2019 09:00 16/09/2019 14:00 300 05:00
817 18/09/2019 14:00 19/09/2019 08:00 1080 18:00
在上面的数据中,ID为817的车辆将持续两天。我如何获得查询以仅返回18/09的时间段或直到18/09的午夜的时间?
返回上面数据的查询:
Select
dwVehicleIDFK,
StartDate,
EndDate,
DATEDIFF(MINUTE, Convert(DateTime, StartDate, 103),
Convert(DateTime, EndDate, 103)) as Minutes,
CONVERT(varchar(5), DATEADD(minute, DATEDIFF(minute,
Convert(DateTime, StartDate, 103),
Convert(DateTime, EndDate, 103)), 0), 114) as HrsMins
from
VehHistory
答案 0 :(得分:1)
假设您已加载指定日期@Day的数据,并将开始/结束日期转换为临时表#temp中的日期时间:
Select
dwVehicleIDFK,
StartDate,
EndDate,
DATEDIFF(MINUTE, CASE WHEN StartDate<@Day THEN @Day ELSE StartDate END,
CASE WHEN EndDate>DATEADD(DAY,1,@Day) THEN DATEADD(DAY,1,@Day) ELSE EndDate END) AS UsedMinutes
from #temp;