2016-10-04 31 views
-2

我試圖創建一個參考表,顯示所有日期,並通過日期鍵引用我的表中。但是,這不是我所期望的。甲骨文 - 創建日期參考表時出現問題

DECLARE 
    start_date DATE := TO_DATE('2009-01-01','YYYY-RR-DD'); 
    end_date DATE := TO_DATE('2021-01-01','YYYY-RR-DD'); 
BEGIN 
    WHILE start_date < end_date LOOP 
     SELECT 
      TO_CHAR(start_date, '-YYYYMMDD') AS DATE_KEY 
      , TO_CHAR(start_date, 'YYYY-MM-DD') AS "ACTUAL_DATE" 
      , EXTRACT(YEAR FROM start_date) AS "YEAR" 
      , EXTRACT(MONTH FROM start_date) AS "MONTH" 
      , TO_CHAR(start_date, 'MONTH') AS "MONTH_NAME" 
      , TO_CHAR(start_date, 'WW') AS "WEEK_OF_YEAR" 
      , EXTRACT(DAY FROM start_date) AS "DAY" 
      , TO_CHAR(start_date, 'DDD') AS "DAY_OF_YEAR" 
      , TO_CHAR(start_date, 'DAY') AS "WEEKDAY" 
      , TO_CHAR(start_date, 'Q') AS "QTR_OF_YEAR" 
      , TO_CHAR(start_date, 'MONTH DD, YYYY') AS FRIENDLY 
     INTO V_DATE 
     FROM dual; 
     start_date := start_date+1; 
    END LOOP; 
END; 

我得到這個錯誤,但不管我嘗試什麼,我總是收到錯誤。 我試過聲明V_DATE,但是這個工作不正常。

作爲解決方法,我能夠在Excel中創建所需的表格,但它在每年的週末有一個小問題。加載此數據後,我可以使用更新查詢來修復此問題。 這將是一個理想的實際查詢將填充,因爲這些數據可能會超出我列出的額外年份。

謝謝你,艾倫

+2

你有日期轉換格式錯誤的面具。你應該使用'YYYY-MM-DD' – Aleksej

+0

你得到*什麼*錯誤?你的聲明格式掩碼有RR而不是MM;你可能想爲這些文件使用ANSI日期文字。您也可以使用分層查詢來填充表,並避免PL/SQL。 –

+0

您正在使用Oracle內置函數。爲什麼你需要一張桌子? –

回答

0

你可以用一條語句創建該表如下:

CREATE TABLE refdates AS 
    SELECT 
     TO_CHAR(start_date, '-YYYYMMDD') AS DATE_KEY 
     , TO_CHAR(start_date, 'YYYY-MM-DD') AS "ACTUAL_DATE" 
     , EXTRACT(YEAR FROM start_date) AS "YEAR" 
     , EXTRACT(MONTH FROM start_date) AS "MONTH" 
     , TO_CHAR(start_date, 'MONTH') AS "MONTH_NAME" 
     , TO_CHAR(start_date, 'WW') AS "WEEK_OF_YEAR" 
     , EXTRACT(DAY FROM start_date) AS "DAY" 
     , TO_CHAR(start_date, 'DDD') AS "DAY_OF_YEAR" 
     , TO_CHAR(start_date, 'DAY') AS "WEEKDAY" 
     , TO_CHAR(start_date, 'Q') AS "QTR_OF_YEAR" 
     , TO_CHAR(start_date, 'MONTH DD, YYYY') AS FRIENDLY 
    FROM (SELECT TO_DATE('2008-12-31','YYYY-MM-DD') + level as start_date 
     FROM dual 
     CONNECT BY level < 10000); 
+0

謝謝,那就是訣竅。需要閱讀CONNECT BY。 –

2

語法:

select . . . 
into v_date 
. . . 

使用(在Oracle)選擇到一個變量。

你似乎想在一個表中插入行:

insert into ??(. . .) 
    <your select here>; 

??是你的表名。 . . .是列的列表。

此外,您還可以免除與PL/SQL,做這一切在一個單一的查詢,通過使用CTE生成所有日期(使用connect by或遞歸CTE)。