我的查询结果包含以下列。 名称,价值,位置,日期 我希望还有两个包含开始日期和结束日期的列。开始日期是星期五,结束日期是下周四。周从2013年7月19日开始。我想对日期列进行分组。 我尝试使用WITH子句来生成周,但我必须进行笛卡尔连接并且连接断开。
WITH Q1 AS
( SELECT dates AS start_date , dates + 6 AS end_date FROM
(SELECT DATE '2013-07-18' + LEVEL-1 dates FROM DUAL CONNECT BY LEVEL <= (TRUNC(SYSDATE)- DATE '2013-07-18'))
WHERE TO_CHAR( dates,'DY') = 'FRI'
)
Select q1.Start_date, q1.end_date, t.name, t.value, t.date
from test1 t,Q1
where date between q1.start_date and Q1.end_date;
我有exadata,这个笛卡尔联接可以正常工作,但不能在其他数据库上运行。
输出应为
Start date End date Name value Date
---------- -------- ---- ----- --------
07/19/2013 07/25/2013 A 5 07/22/2013
07/19/2013 07/25/2013 b 3 07/23/2013
07/26/2013 08/01/2013 c 6 08/01/2013
08/02/2013 08/08/2013 A 2 08/06/2013
---
--
--
11/29/2013 12/05/2013 t 5 12/01/2013
11/29/2013 12/05/2013 s 3 12/02/2013
11/29/2013 12/05/2013 t 5 12/02/2013
答案 0 :(得分:1)
TRUNC(日期,'IW')诀窍 - 找到一周的第一天。那就是算术。
select to_date('07/18/2013', 'mm/dd/yyyy') + rownum cur_date,
TRUNC((to_date('07/18/2013', 'mm/dd/yyyy') + rownum) - 4, 'IW') + 4 as start_date,
TRUNC((to_date('07/18/2013', 'mm/dd/yyyy') + rownum) + 3, 'IW') + 3 as end_date
from dual connect by level <= 100;
CUR_DATE START_DATE END_DATE
-------------------------------------
19-JUL-13 19-JUL-13 25-JUL-13
20-JUL-13 19-JUL-13 25-JUL-13
21-JUL-13 19-JUL-13 25-JUL-13
22-JUL-13 19-JUL-13 25-JUL-13
23-JUL-13 19-JUL-13 25-JUL-13
24-JUL-13 19-JUL-13 25-JUL-13
25-JUL-13 19-JUL-13 25-JUL-13
26-JUL-13 26-JUL-13 01-AUG-13
27-JUL-13 26-JUL-13 01-AUG-13
28-JUL-13 26-JUL-13 01-AUG-13
29-JUL-13 26-JUL-13 01-AUG-13
30-JUL-13 26-JUL-13 01-AUG-13
31-JUL-13 26-JUL-13 01-AUG-13
01-AUG-13 26-JUL-13 01-AUG-13