格式和结构数据

时间:2019-02-18 11:08:27

标签: sql oracle

对于Oracle DB,我具有以下结构:

不幸的是,我有一个将时间戳与日期分开的数据库。 有一个jDate列,其中包含特定格式的日期。

并且tEnd具有以下格式:0 = 00:00:00 240000 = 24:00:00 63000 = 06:30:00

与“ tStart”相同,但永远不会有240000的值。

首先我要确切的时间。如果“ tStart” = 0且“ tEnd” = 63000,则持续时间为0.25。然后,如果“ tEnd” <= 120000并且“ dTeam” = 3,我想从“ jDate”中减去1(一天)。

如何根据以下方法对此进行调整? 我已经弄清楚了一些州长。

您有什么建议吗?

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 :(得分:1)

由于您已经在日期转换中使用了下限/修改和间隔,因此您也可以将其扩展为时间部分;并获取开始/结束日期作为实际日期数据类型。加上一些样本数据:

0000-00-00
0000-01-01

由于时间的“小时”部分只是数字,而不是实际的日期/时间,因此结束时间240000自动添加一天-请参见输出的第二行和第五行。

然后,您可以根据需要将日期调整为一天,或者在获取该数据之后,或者作为转化的一部分,例如使用案例表达式来修改“天数”计算:

-- 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;

...尽管如果最后两行应该表示一个班次,我不认为您确实想这样做。

无论哪种方式,一旦将它们作为日期,持续时间的计算就变得很简单。您可以将该查询用作嵌入式视图或CTE:

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