根据 SQL Server 中的车辆性能计算累积运行年数/小时。计算开始和失败日期车辆状态之间的日期不同

岩石

条件 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。

史蒂夫·C

我想你正在寻找这样的东西。该查询用于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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章