0

以下に示すように、会社のカレンダーをデータベースに保存します。会社のカレンダーは土曜から金曜まで始まることに注意してください:-

   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

やろうとしているのは、Week#、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

誰かがこれにもっと光を当てることができれば、非常に感謝していますか?

4

3 に答える 3

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 句の start_date を開始日に置き換えます。これは、この変更後の最初の SAT になります。開始日には他の SAT を選択できますが、その年の最初の SAT である必要はありません。

       SELECT Next_Day(Trunc(Sysdate,'Y'),'SAT') + LEVEL-1 AS start_date FROM dual...
    
  2. CASE を外側のクエリに追加します - 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
    
于 2013-02-25T18:10:47.993 に答える
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');
于 2013-02-24T08:09:01.010 に答える
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'))
于 2013-02-24T16:32:17.200 に答える