条件 1:如果车辆没有发生故障,则计算车辆开始日期到今天日期之间的累计运行小时数。
条件 2:如果车辆出现故障,计算车辆启动日期到故障日期之间的累计运行小时数
注意:每辆车都有多个/单个开始日期和多个/单个/无失败日期。因此计算每个车辆 ID 的累计运行小时数/年
下面的示例 SQL 表,
车辆_ID | 地位 | 日期时间 |
---|---|---|
1 | 开始 | 2018-05-23 |
1 | 开始 | 2021-06-15 |
1 | 失败的 | 2020-08-10 |
2 | 开始 | 2019-06-23 |
3 | 开始 | 2010-04-20 |
3 | 失败的 | 2010-05-10 |
4 | 开始 | 2011-01-20 |
4 | 失败的 | 2015-01-14 |
4 | 开始 | 2016-02-25 |
4 | 失败的 | 2019-04-10 |
上面的车辆 ID 1 有 2 个开始日期和 1 个失败日期,因此计算第一个开始日期到第一个失败日期+第二个开始日期到截止日期之间的运行年数(第二个开始日期后没有发生故障)。
车辆 ID 4 有 2 个开始日期和 2 个失败日期,因此计算第一个开始日期到第一个失败日期 + 第二个开始日期到第二个失败日期之间的运行年数。
我尝试使用以下代码来计算开始日期到失败日期之间的运行时间,但在计算剩余条件时遇到了困难。
SELECT
t1.[Date_On],
t1.[VehicleID],
DATEDIFF(DD, t1.[Date_On], t2.[Date_On]) / 365.0 as RunYears
FROM Vehicle_master t1
INNER JOIN Vehicle_master t2 on t1.[VehicleID] = t2.[VehicleID]
where t1.[status] = 'Start'
and t2.[status] = 'Failed'
and t1.[Date_On] <=t2.[Date_On]
order by t1.VehicleID
我想要如下格式的结果
车辆ID | 运行_年 |
---|---|
1 | 2.358 |
4 | 7.109 |
以上运行年基于以下计算,
车辆 ID 1:
第一次开始到第一次失败= 2.21917
第二次开始至今(车辆 ID 1 中没有第二次失败)= 0.13972
所以总和运行年数 = 2.3589。
车辆 ID 4:
第一次开始到第一次失败= 3.986
第二次开始到第二次失败的日期 = 3.123
所以总和运行年数 = 7.109。
我想你正在寻找这样的东西。该查询用于CROSS APPLY
查找“失败”日期或返回 NULL 作为“m.min_dt”。然后 min_dt 用于计算失败日期或GETDATE
(今天的日期)之间的(小时)差异
drop table if exists #samples;
go
create table #samples (
vehicle_id int not null,
stat varchar(10) not null,
date_on datetime not null);
insert #samples(vehicle_id, stat, date_on) values
(1, 'Start', cast('2018-05-23' as date)),
(1, 'Start', cast('2021-06-15' as date)),
(1, 'Failed', cast('2020-08-10' as date)),
(2, 'Start', cast('2019-06-23' as date)),
(3, 'Start', cast('2010-05-23' as date)),
(3, 'Failed', cast('2010-05-23' as date)),
(4, 'Start', cast('2011-05-23' as date)),
(4, 'Failed', cast('2015-05-23' as date)),
(4, 'Start', cast('2016-05-23' as date)),
(4, 'Failed', cast('2019-05-23' as date));
select s.*, datediff(day, date_on, isnull(m.min_dt, getdate()))/365.0 run_years
from #samples s
cross apply (select min(date_on) min_dt
from #samples ss
where s.vehicle_id=ss.vehicle_id
and s.date_on<ss.date_on
and ss.stat='Failed') m
where s.stat='Start';
vehicle_id stat date_on run_years
1 Start 2018-05-23 00:00:00.000 2.219178
1 Start 2021-06-15 00:00:00.000 0.139726
2 Start 2019-06-23 00:00:00.000 2.120547
3 Start 2010-05-23 00:00:00.000 11.210958
4 Start 2011-05-23 00:00:00.000 4.002739
4 Start 2016-05-23 00:00:00.000 3.000000
汇总每辆车的运行时间
select s.vehicle_id, sum(datediff(day, date_on, isnull(m.min_dt, getdate()))/365.0) run_years
from #samples s
cross apply (select min(date_on) min_dt
from #samples ss
where s.vehicle_id=ss.vehicle_id
and s.date_on<ss.date_on
and ss.stat='Failed') m
where s.stat='Start'
group by s.vehicle_id
order by s.vehicle_id;
vehicle_id run_years
1 2.358904
2 2.120547
3 11.210958
4 7.002739
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句