1

この質問は簡略化されているので、私を批判しないでください。

CALENDAR2つの列を持つテーブルを取得したと仮定します:CLIENT_ID (INTEGER)そしてENTRY_DATE(DATE)このデータ:

+----------------------------+
| CLIENT_ID |   ENTRY_DATE   |
+-----------+----------------+
|   100     |    2012-01-03  |
|   100     |    2012-01-23  |
+-----------+----------------+

INSERTインライン行方不明日を使用するにはどうすればよいですか?

4

4 に答える 4

1

日を生成し、カレンダーに参加します。

select 
   nvl(calendar.client_id,100), 
   dt.day as entry_date
from (select to_date('1-Jan-2012','dd-mon-yyyy')+level-1
      from dual connect by level<=366
      ) dt
left join Calendar
  on (calendar.entry_date=dt.day and client_id = 100)
于 2013-01-30T12:58:34.037 に答える
1

このクエリは、すべてのクライアントのカレンダー ホールを挿入します。

INSERT INTO calendar (client_id, entry_date) (
    SELECT holes.client_id, holes.hole
    FROM (
            SELECT cal.client_id, cal.mn + level AS hole
            FROM (
                    SELECT client_id, MIN(entry_date) AS mn, MAX(entry_date) AS mx
                    FROM calendar
                    GROUP BY client_id
                    HAVING MAX(entry_date)>MIN(entry_date)+1
                 ) cal
            CONNECT BY cal.mn + level < cal.mx
            GROUP BY cal.client_id, cal.mn + level
        ) holes LEFT OUTER JOIN calendar c ON holes.client_id = c.client_id AND c.entry_date = hole
    WHERE
        c.entry_date IS NULL
)
于 2013-01-30T14:16:28.927 に答える
0

たぶんこれが役立ちます-Oracleクエリ。日付を比較し、欠落している日付のみを挿入する方法を理解する必要があります。開始日はエントリー日です。残りはさらに...:

-- Annual table by date and ISO week - use WW format for non-iso week--
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#_iw  
  FROM
  (
   SELECT TRUNC(SYSDATE, 'YEAR')-1 + LEVEL AS start_date  -- 11/1/2013 --
    FROM dual
   CONNECT BY LEVEL <= 
   (-- Number of Days in curr year = 365 --
   SELECT TRUNC(ADD_MONTHS (SYSDATE, 12), 'Y')-TRUNC(SYSDATE, 'Y')    
    FROM dual
   )
  )
 /

 SQL>

 START_DATE   WK_STARTS   WK_ENDS                  ISO_WK#_IW
 --------------------------------------------------------------
 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/14/2013    1/14/2013 1/20/2013 11:59:59 PM       3
 1/15/2013    1/14/2013 1/20/2013 11:59:59 PM       3
 ....
 12/29/2013   12/23/2013    12/29/2013 11:59:59 PM  52
 12/30/2013   12/30/2013    1/5/2014 11:59:59 PM    1
 12/31/2013   12/30/2013    1/5/2014 11:59:59 PM    1
于 2013-01-30T13:49:16.040 に答える
0

FlorinGhitaの回答に基づく:

SELECT 100, TO_DATE('2012-01-03', 'YYYY-MM-DD') + LEVEL 
  FROM DUAL
CONNECT BY LEVEL < TO_DATE('2012-01-23', 'YYYY-MM-DD') - TO_DATE('2012-01-03', 'YYYY-MM-DD')
于 2013-01-30T13:49:35.447 に答える