【发布时间】:2014-02-19 18:49:10
【问题描述】:
我有一些数据定义了一个时间范围。
CREATE TABLE MY_TIME_TABLE
(
MY_PK NUMBER(10) NOT NULL ENABLE,
FROM_TIME DATE NOT NULL ENABLE,
TO_TIME DATE NOT NULL ENABLE
);
INSERT INTO MY_TIME_TABLE(MY_PK,FROM_TIME,TO_TIME)
VALUES(1,TO_DATE('2014-01-01 09:00:00', 'YYYY-MM-DD HH24:MI:SS'),TO_DATE('2014-01-01 13:00:00', 'YYYY-MM-DD HH24:MI:SS');
INSERT INTO MY_TIME_TABLE(MY_PK,FROM_TIME,TO_TIME)
VALUES(2,TO_DATE('2014-01-02 14:00:00', 'YYYY-MM-DD HH24:MI:SS'),TO_DATE('2014-01-02 15:00:00', 'YYYY-MM-DD HH24:MI:SS');
INSERT INTO MY_TIME_TABLEMY_PK,(FROM_TIME,TO_TIME)
VALUES(3,TO_DATE('2014-01-03 00:30:00', 'YYYY-MM-DD HH24:MI:SS'),TO_DATE('2014-01-03 03:30:00', 'YYYY-MM-DD HH24:MI:SS');
我想做的是创建一个查询,该查询将返回两次之间的所有半小时块。所以它会返回如下内容:
1, 2014-01-01 09:00:00
1, 2014-01-01 09:30:00
1, 2014-01-01 10:00:00
1, 2014-01-01 10:30:00
1, 2014-01-01 11:00:00
1, 2014-01-01 11:30:00
1, 2014-01-01 12:00:00
1, 2014-01-01 12:30:00
2, 2014-01-02 14:00:00
2, 2014-01-02 14:30:00
3, 2014-01-03 00:30:00
3, 2014-01-03 01:00:00
3, 2014-01-03 01:30:00
3, 2014-01-03 02:00:00
3, 2014-01-03 02:30:00
3, 2014-01-03 03:00:00
数据保证每小时或半小时开始和结束,所以我不必担心部分匹配。
我通常会尝试展示自己为解决问题所做的工作,但在这种情况下,我什至不知道从哪里开始。
【问题讨论】:
-
寻找
CTE——这是生成一系列数据(即日期)的常用方法。 -
您可以通过减去日期和 div 分钟数除以 30 来找到周期数,然后使用 ((number table * period in between) * 30) 将分钟数添加回开始时间以创建时间戳。
-
啊,我还没有遇到CTE。我一定会调查的。 bd33:这听起来也可以。不过,我将把它合并到一个更大的查询中,并且有些事情告诉我这可能会很快变得复杂。我想,直到我试一试才知道。
-
你用的是什么oracle版本?
-
我正在使用 11g R2 进行开发,但它也必须在 10g R2 上运行。