Поскольку вы уже используете пол / мод и интервалы для преобразования даты, вы можете расширить это также для временных отрезков;и получить начало / конец как фактические типы данных даты.С некоторыми подготовленными образцами данных:
-- dummy data
with "UnitsDay" ("Dep", "dTeam", "IDPers", "jDate", "tStart", "tEnd") as (
select 1, 1, 1, 118273, 0, 63000 from dual
union all
select 1, 2, 2, 118273, 160000, 240000 from dual
union all
select 1, 3, 3, 118273, 0, 63000 from dual
union all
select 1, 3, 4, 118273, 120000, 123456 from dual
union all
select 1, 3, 5, 118273, 220000, 240000 from dual
union all
select 1, 3, 5, 118274, 0, 80000 from dual
)
-- actual query
select
date '1899-12-31'
+ floor("jDate" / 1000) * interval '1' year
+ mod("jDate", 1000) * interval '1' day
+ floor("tStart" / 10000) * interval '1' hour
+ floor(mod("tStart", 10000) / 100) * interval '1' minute
+ mod("tStart", 100) * interval '1' second
as "Start",
date '1899-12-31'
+ floor("jDate" / 1000) * interval '1' year
+ mod("jDate", 1000) * interval '1' day
+ floor("tEnd" / 10000) * interval '1' hour
+ floor(mod("tEnd", 10000) / 100) * interval '1' minute
+ mod("tEnd", 100) * interval '1' second
as "End",
"IDPers" as "ID",
"dTeam" as "Team"
from "UnitsDay"
where "jDate" > 118000
and "Dep" = 1;
Start End ID Team
------------------- ------------------- ---------- ----------
2018-09-30 00:00:00 2018-09-30 06:30:00 1 1
2018-09-30 16:00:00 2018-10-01 00:00:00 2 2
2018-09-30 00:00:00 2018-09-30 06:30:00 3 3
2018-09-30 12:00:00 2018-09-30 12:34:56 4 3
2018-09-30 22:00:00 2018-10-01 00:00:00 5 3
2018-10-01 00:00:00 2018-10-01 08:00:00 5 3
Поскольку часть времени в «часах» просто обрабатывается как число, а не как фактическая дата / время, а время окончания 240000 автоматически добавляетдень - см. вторую и пятую строки выходных данных.
Затем вы можете отрегулировать день на единицу, если вам нужно, либо после получения этих данных, либо в рамках преобразования, например, с использованием выражения регистрачтобы изменить вычисление «дней»:
select
date '1899-12-31'
+ floor("jDate" / 1000) * interval '1' year
+ (
mod("jDate", 1000)
- case when "tEnd" < 120000 and "dTeam" = 3 then 1 else 0 end
) * interval '1' day
+ floor("tStart" / 10000) * interval '1' hour
+ floor(mod("tStart", 10000) / 100) * interval '1' minute
+ mod("tStart", 100) * interval '1' second
as "Start",
date '1899-12-31'
+ floor("jDate" / 1000) * interval '1' year
+ (
mod("jDate", 1000)
- case when "tEnd" < 120000 and "dTeam" = 3 then 1 else 0 end
) * interval '1' day
+ floor("tEnd" / 10000) * interval '1' hour
+ floor(mod("tEnd", 10000) / 100) * interval '1' minute
+ mod("tEnd", 100) * interval '1' second
as "End",
"IDPers" as "ID",
"dTeam" as "Team"
from "UnitsDay"
where "jDate" > 118000
and "Dep" = 1;
Start End ID Team
------------------- ------------------- ---------- ----------
2018-09-30 00:00:00 2018-09-30 06:30:00 1 1
2018-09-30 16:00:00 2018-10-01 00:00:00 2 2
2018-09-29 00:00:00 2018-09-29 06:30:00 3 3
2018-09-30 12:00:00 2018-09-30 12:34:56 4 3
2018-09-30 22:00:00 2018-10-01 00:00:00 5 3
2018-09-30 00:00:00 2018-09-30 08:00:00 5 3
... хотя, если эти последние две строки должны представлять одну смену, я не думаю, что вы действительно хотите это сделать.
В любом случае, если у вас есть их в качестве даты, расчет продолжительности становится простым.Вы можете использовать этот запрос в качестве встроенного представления или CTE:
with cte ("Start", "End", "ID", "Team") as (
select
date '1899-12-31'
+ floor("jDate" / 1000) * interval '1' year
+ mod("jDate", 1000) * interval '1' day
+ floor("tStart" / 10000) * interval '1' hour
+ floor(mod("tStart", 10000) / 100) * interval '1' minute
+ mod("tStart", 100) * interval '1' second,
date '1899-12-31'
+ floor("jDate" / 1000) * interval '1' year
+ mod("jDate", 1000) * interval '1' day
+ floor("tEnd" / 10000) * interval '1' hour
+ floor(mod("tEnd", 10000) / 100) * interval '1' minute
+ mod("tEnd", 100) * interval '1' second,
"IDPers",
"dTeam"
from "UnitsDay"
where "jDate" > 118000
and "Dep" = 1
)
select cte.*, "End" - "Start" as "Duration"
from cte;
Start End ID Team Duration
------------------- ------------------- ---------- ---------- ----------
2018-09-30 00:00:00 2018-09-30 06:30:00 1 1 .270833333
2018-09-30 16:00:00 2018-10-01 00:00:00 2 2 .333333333
2018-09-30 00:00:00 2018-09-30 06:30:00 3 3 .270833333
2018-09-30 12:00:00 2018-09-30 12:34:56 4 3 .0242592593
2018-09-30 22:00:00 2018-10-01 00:00:00 5 3 .0833333333
2018-10-01 00:00:00 2018-10-01 08:00:00 5 3 .333333333