2013-02-24 53 views
0

将公司日历存储在数据库中,如下所示。需要注意的是公司历经过周五从周六开始: -用于创建聚合视图的Oracle sql查询

Date1  Week  Month Quarter  Year Shift 
23-FEB-13 9  6  2   2013  ABC 
23-FEB-13 9  6  2   2013  DEF 
22-FEB-13 9  6  2   2013  ABC1 
22-FEB-13 9  6  2   2013  DEF2 
21-FEB-13 8  6  2   2013  DEF2 

什么我试图做的是创建一个视图来存储周#,StartWeek,EndWeek即存储当前一周的开始和结束日期像

Week StartWeek EndWeek 

    9  22-FEB-13  23-FEB-13 

这是我迄今为止

SELECT START_DATETIME, F_WEEK, ROW_NUMBER() OVER (PARTITION BY F_WEEK, F_YEAR ORDER BY SHIFT DESC) RNUM FROM COMMON.FISCAL_CALENDAR WHERE F_WEEK IN (SELECT F_WEEK FROM COMMON.FISCAL_CALENDAR WHERE TO_DATE(START_DATETIME, 'DD-MON-YY') = TO_DATE(SYSDATE, 'DD-MON-YY')) AND F_YEAR IN (SELECT F_YEAR FROM COMMON.FISCAL_CALENDAR WHERE TO_DATE(START_DATETIME, 'DD-MON-YY') = TO_DATE(SYSDATE, 'DD-MON-YY')) ORDER BY START_DATETIME DESC 

会高度赞赏,如果任何人都可以扔在这更多的光线?

+1

你真的想忽略'Year'?忽略它的任何解决方案都会捆绑2013年第7周,2012年第7周(以及每隔一年) – 2013-02-24 08:11:36

回答

0

这里是它

SELECT MAX(DATE1) AS SHIFT_END_TIME, MIN(DATE1) AS SHIFT_START_TIME, WEEK, YEAR FROM MYTABLE GROUP BY WEEK, YEAR HAVING WEEK IN (SELECT WEEK FROM MYTABLE WHERE TO_DATE(DATE1, 'DD-MON-YY') = TO_DATE(SYSDATE, 'DD-MON-YY')) AND YEAR IN (SELECT YEAR FROM MYTABLE WHERE TO_DATE(DATE1, 'DD- MON-YY') = TO_DATE(SYSDATE, 'DD-MON-YY')) 
1

我认为您的需求是非常得到按星期分组的最小和最大日期:

SELECT Week, MIN(Date) As StartWeek, MAX(Date) As EndWeek 
FROM original_table 
GROUP BY Week; 

如果你有兴趣只在当前周:

SELECT Week, MIN(Date) As StartWeek, MAX(Date) As EndWeek 
FROM original_table 
WHERE Week = TO_CHAR(sysdate, 'IW'); 
+0

这是正确的,但仅适用于本周。上面更新了我的问题。 – 2013-02-24 08:32:46

+1

要获取当前周:to_char(sysdate,'IW') – 2013-02-24 08:40:13

+0

不错的想法,但公司日历周与正常日历周不同。 – 2013-02-24 16:30:55

2

周周开始/结束日期和周数的周表 - 您可以使用日期以开始和结束日期并添加您的计算:

SELECT start_date 
    , TRUNC(start_date, 'iw')     wk_starts 
    , TRUNC(start_date, 'iw') + 7 - 1/86400 wk_ends 
    , TO_NUMBER (TO_CHAR (start_date, 'IW')) ISO_wk# 
FROM 
(
    SELECT TRUNC(SYSDATE, 'YEAR')-1 + LEVEL AS start_date 
    FROM dual 
    CONNECT BY LEVEL <= 
    (
    SELECT TRUNC(ADD_MONTHS (SYSDATE, 12), 'Y')-TRUNC(SYSDATE, 'Y') "Num of Days in 2013" 
    FROM dual 
) 
) 
/

START_DATE WK_STARTS WK_ENDS    ISO_WK# 
---------------------------------------------------- 
1/1/2013 12/31/2012 1/6/2013 11:59:59 PM 1 
1/2/2013 12/31/2012 1/6/2013 11:59:59 PM 1 
.... 
.... 
1/7/2013 1/7/2013 1/13/2013 11:59:59 PM 2 
1/8/2013 1/7/2013 1/13/2013 11:59:59 PM 2 

这些是快速修复建议。您可以根据您的表格和日期添加更多计算... 对于公司日历,您需要在上述查询中添加一些计算和更改。 您可以添加结束日期。我建立了年度表格,但您可以将CONNECT BY中的日期替换为您的日期,例如您的日期之间的天数

...CONNECT BY LEVEL <= (your_end_date - your_start_date) 

其他修正:

  1. 更换我的起始日期在FROM子句开始日期 - 这一变化后,将是今年的第一个周六你可以挑任何其他SAT的开始日期,并不一定是今年的第一次SAT:

    SELECT Next_Day(Trunc(Sysdate,'Y'),'SAT') + LEVEL-1 AS start_date FROM dual... 
    
  2. 添加情况下的外部查询 - 后ISO_Wk#。删除不需要的列...:

    SELECT start_date 
    , TRUNC(start_date, 'iw')     wk_starts 
    , TRUNC(start_date, 'iw') + 7 - 1/86400 wk_ends 
    , TO_NUMBER (TO_CHAR (start_date, 'IW')) ISO_wk# 
    , (CASE WHEN TO_CHAR(start_date, 'DY') = 'SAT' THEN start_date END) your_wk_start 
    , (CASE WHEN TO_CHAR(start_date, 'DY') = 'FRI' THEN TRUNC(start_date, 'iw') + 7 - 1/86400 END) your_wk_end 
        .... 
    START_DATE WK_STARTS WK_ENDS ISO_WK# WK_DAY YOUR_WK_START YOUR_WK_END 
    -------------------------------------------------------------------------------------- 
    1/5/2013 12/31/2012 1/6/2013 11:59:59 PM 1 SAT 1/5/2013  
    1/6/2013 12/31/2012 1/6/2013 11:59:59 PM 1 SUN   
    .... 
    .... 
    1/11/2013 1/7/2013 1/13/2013 11:59:59 PM 2 FRI    1/13/2013 11:59:59 PM 
    1/12/2013 1/7/2013 1/13/2013 11:59:59 PM 2 SAT 1/12/2013  
    .... 
    ....  
    1/18/2013 1/14/2013 1/20/2013 11:59:59 PM 3 FRI    1/20/2013 11:59:59 PM 
    
+0

好主意!但是,公司日历与ISO日历不同,每周从周六到周五开始。 – 2013-02-25 19:41:40