查询根据时间减去时间来选择行
Posted
技术标签:
【中文标题】查询根据时间减去时间来选择行【英文标题】:Query to select rows based on time minus time 【发布时间】:2022-01-18 01:13:25 【问题描述】:我想在 oracle 11g R2 上构建一个查询,我有下表:
我们以第一行为例:第一行 F11 是下午 1 点,T11 是下午 3 点,下午 1 点和下午 3 点之间的差是 120 分钟,我有一个变量 X,假设 X=10,什么我想要创建一个查询来选择下午 1 点到 3 点之间的行除以 X ,所以我应该有 12 行。
【问题讨论】:
12行什么? 【参考方案1】:我认为这是您正在寻找的分层查询。这 12 行将代表 f11
(开始时间)加上 120 分钟除以 x
值(即 10
)所以 - 那是 12
分钟。
如果是这样,那就去吧:
SQL> var x number;
SQL> exec :x := 10;
PL/SQL procedure successfully completed.
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:Mi:ss';
Session altered.
SQL> with test (id, f11, t11) as
2 (select 1,
3 to_date('28.03.2022 01:00', 'dd.mm.yyyy hh24:mi'),
4 to_date('28.03.2022 03:00', 'dd.mm.yyyy hh24:mi')
5 from dual union all
6 --
7 select 2,
8 to_date('29.11.2021 01:00', 'dd.mm.yyyy hh24:mi'),
9 to_date('29.11.2021 01:30', 'dd.mm.yyyy hh24:mi')
10 from dual
11 ),
12 temp as
13 (select id, f11, (t11 - f11) * (24 * 60) diff
14 from test
15 )
16 select id,
17 f11 + (diff / :x) / (24 * 60) * (column_value - 1) val
18 from temp
19 cross join table(cast(multiset(select level from dual
20 connect by level <= diff / :x
21 ) as sys.odcinumberlist))
22 order by id, val;
ID VAL
---------- -------------------
1 28.03.2022 01:00:00
1 28.03.2022 01:12:00
1 28.03.2022 01:24:00
1 28.03.2022 01:36:00
1 28.03.2022 01:48:00
1 28.03.2022 02:00:00
1 28.03.2022 02:12:00
1 28.03.2022 02:24:00
1 28.03.2022 02:36:00
1 28.03.2022 02:48:00
1 28.03.2022 03:00:00
1 28.03.2022 03:12:00
2 29.11.2021 01:00:00
2 29.11.2021 01:03:00
2 29.11.2021 01:06:00
15 rows selected.
SQL>
【讨论】:
不客气。以上是关于查询根据时间减去时间来选择行的主要内容,如果未能解决你的问题,请参考以下文章
如何根据oracle plsql中列中的逗号分隔值拆分选择查询行