Формат и структура данных - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть следующая структура для БД Oracle:

К сожалению, у меня есть БД, которая отделяет метку времени от даты.Есть столбец jDate, который включает в себя дату в определенном формате.

И есть тренд со следующим форматом: 0 = 00:00:00 240000 = 24:00:00 63000 = 06:30:00

То же самое для "tStart", но никогда не бывает значения 240000.

Сначала я хочу указать точную продолжительность.Если «tStart» = 0 и «tEnd» = 63000, то продолжительность равна 0,25.Затем я хотел бы вычесть 1 (один день) из «jDate», если «tEnd» <= 120000 и «dTeam» = 3. </p>

Как я могу адаптировать это на следующем подходе?Я уже выяснил некоторые государственные деятели.

Вы предлагали какие-либо предложения?

SELECT
    DATE '1900-01-01' + FLOOR("jDate" / 1000) * INTERVAL'1' YEAR+ (MOD("jDate", 1000) -1) * INTERVAL'1' DAY AS "Date",
    CASE WHEN "tEnd" =240000 THEN '23:59:59' ELSE REPLACE(TO_CHAR("tEnd", '00,00,00'),',',':') END AS "End",
    REPLACE(TO_CHAR("tStart", '00,00,00'),',',':') AS "Start",
    "IDPers" AS "ID",
    "dTeam" as "Team" FROM "GlobalDB"."UnitsDay"

WHERE   "jDate" >118000
    AND "Dep" = 1

1 Ответ

0 голосов
/ 18 февраля 2019

Поскольку вы уже используете пол / мод и интервалы для преобразования даты, вы можете расширить это также для временных отрезков;и получить начало / конец как фактические типы данных даты.С некоторыми подготовленными образцами данных:

-- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...