2016-12-05 249 views
0

我想在SQL Developer(使用Oracle數據庫)中運行此SQL查詢。基本上我想選擇A.APPT_DATE至少有2個月的所有列,但我一直得到'不是有效的月份錯誤' - 以粗體突出顯示。如果我把這個從句放在外面,它可以正常工作。SQL在哪裏濫用日期 - 不是有效的月份錯誤

SELECT D.DOC_ID AS "Doctor ID", D.STATUS, A.APPT_DATE, COUNT(DISTINCT A.APPT_ID) AS "Number of appointments", DI.CASE, P.PET_ID AS "Pet ID", P.PET_NAME AS "Pet Name" 
FROM VET_DOCTOR D 
JOIN 
APPOINTMENT A ON (D.DOC_ID=A.DOC_ID) WHERE A.APPT_DATE <= DATE '10-January-2016' 
JOIN 
DIAGNOSIS DI ON (A.APPT_ID=DI.APPT_ID) 
JOIN 
PET P ON (A.PET_ID=P.PET_ID) WHERE DI.CASE IN('Socialisation','Dental') 
GROUP BY D.DOC_ID, D.STATUS, A.APPT_DATE, A.APPT_ID, DI.CASE, P.PET_ID, P.PET_NAME; 
+0

嘗試的日期2016' '10月(不帶 - ) – kevchadders

+0

哪個數據庫? –

+0

@kevchadders我試過並得到以下錯誤:原因:輸入中的文字必須與格式字符串(除前導空格之外)中的文字長度相同 。如果 「FX」修飾符已打開,則文字必須完全匹配, 不帶任何額外的空格。 –

回答

0

我不確定,但我猜日期格式是這樣的DD-Mon-YYYY。所以你需要這樣做:'10-JAN-2016'

讓我知道是否有幫助。

+0

日期格式爲DD-MM-YYYY,日期輸入爲'01-1999年1月'例如。我只是嘗試了你的建議,但它仍然給了我'不是有效月份'的錯誤。謝謝 –

+0

那麼根據你的日期格式'DD-MM-YYYY',你應該使用''10 -01-2016''吧? – Nebi

0

假設您的日期正確的數據類型作爲下存儲DATE

可以嘗試的YYYY-MM-DD格式,我希望它會使用Datetime Literals

<= DATE '2016-01-10' 
+0

謝謝我嘗試了你的建議,但我收到以下錯誤:SQL命令未正確結束「 –

+0

如果錯誤出現在SQL的另一部分中,現在是否可以簡化查詢:請嘗試如下所示:SELECT * FROM APPOINTMENT WHERE APPT_DATE <= DATE'2016-01-10' – kevchadders

+0

或使用其他日期格式建議,這將有助於您專注於日期問題 – kevchadders

0

試試這個工作:

WHERE A.APPT_DATE <= TO_DATE('10/JAN/2016','dd/mon/yyyy') 
0
to_DATE('10-01-2016','DD-MM-YYYY') 

所以你是獨立於語言

0

2件事情: 1.如果您想要採用標準方式,日期應該輸入爲'DD-Mon-YYYY',例如'01-Jan-2016'。

因此,您的查詢將是:

SELECT D.DOC_ID AS "Doctor ID", D.STATUS, A.APPT_DATE, COUNT(DISTINCT A.APPT_ID) AS "Number of appointments", DI.CASE, P.PET_ID AS "Pet ID", P.PET_NAME AS "Pet Name" 
    FROM VET_DOCTOR D 
    JOIN 
    APPOINTMENT A ON (D.DOC_ID=A.DOC_ID) WHERE A.APPT_DATE <= '10-Jan-2016' 
    JOIN 
    DIAGNOSIS DI ON (A.APPT_ID=DI.APPT_ID) 
    JOIN 
    PET P ON (A.PET_ID=P.PET_ID) WHERE DI.CASE IN('Socialisation','Dental') 
    GROUP BY D.DOC_ID, D.STATUS, A.APPT_DATE, A.APPT_ID, DI.CASE, P.PET_ID, P.PET_NAME; 

如果提示錯誤,試試這個:

運行下面的查詢:

ALTER SESSION SET nls_date_format = 'DD-Mon-YYYY'; 

這將強制使用日期的標準格式輸入。

  • 如果你希望它是輸入作爲全月唯一的,則:

    ALTER SESSION SET nls_date_format = 'DD-Month-YYYY'; 
    
  • 然後運行查詢:

    SELECT D.DOC_ID AS "Doctor ID", D.STATUS, A.APPT_DATE, COUNT(DISTINCT A.APPT_ID) AS "Number of appointments", DI.CASE, P.PET_ID AS "Pet ID", P.PET_NAME AS "Pet Name" 
        FROM VET_DOCTOR D 
        JOIN 
        APPOINTMENT A ON (D.DOC_ID=A.DOC_ID) WHERE A.APPT_DATE <= '10-January-2016' 
        JOIN 
        DIAGNOSIS DI ON (A.APPT_ID=DI.APPT_ID) 
        JOIN 
        PET P ON (A.PET_ID=P.PET_ID) WHERE DI.CASE IN('Socialisation','Dental') 
        GROUP BY D.DOC_ID, D.STATUS, A.APPT_DATE, A.APPT_ID, DI.CASE, P.PET_ID, P.PET_NAME; 
    

    同樣在你的原始查詢中,我看到了DATE,你是否想要將日期'10-Jan-2016'轉換爲比較日期?在這種情況下,您需要它像TO_DATE('您的日期','格式字符串')。 爲什麼我問這個是因爲,就來看看下面的兩個查詢,第一次拋出錯誤(一樣的,你做了什麼),二不:

    SELECT sysdate FROM dual WHERE sysdate >= DATE '10-January-2016'; 
        SELECT sysdate FROM dual WHERE sysdate >= '10-January-2016'; 
    
    +0

    請參閱https://docs.oracle.com/cd/B28359_01/server.111/b28286/ sql_elements004.htm#CDEHIFJA獲取日期格式的完整列表 –

    +0

    不要依賴'NLS_DATE_FORMAT'來提供一致的日期格式 - 它是一個會話變量,對於每個用戶都是不同的,每個用戶都可以將其更改爲任何格式如果你想要一個特定的日期格式掩碼,那麼[在[TO_DATE]功能]中指定它(使用NLS設置)(http://stackoverflow.com/documentation/oracle/2087/dates/6846/生成-日期與 - 無時間的組件#噸= 201612051401455871023)。 – MT0

    +0

    同意。只是希望用戶檢查下來的實際問題。雖然我認爲問題是在輸入實際日期之前使用了單詞日期,請參閱答案中的最後幾行。 –

    0

    很多問題的答案在這裏相當正確地指出您需要使用TO_DATE函數將字符串轉換爲日期,並且您必須聲明格式。然而,你的原始帖子說你想提取'至少兩個月前'的實體。爲此,我會用:

    WHERE A.APPT_DATE <= ADD_MONTHS(sysdate,-2) 
    

    那麼你不需要重新編寫查詢明天

    0

    WHERE子句不能在JOIN條款的中間:

    SELECT D.DOC_ID AS "Doctor ID", 
         D.STATUS, 
         A.APPT_DATE, 
         COUNT(DISTINCT A.APPT_ID) AS "Number of appointments", 
         DI.CASE, 
         P.PET_ID AS "Pet ID", 
         P.PET_NAME AS "Pet Name" 
    FROM VET_DOCTOR D 
         JOIN APPOINTMENT A ON (D.DOC_ID=A.DOC_ID) 
         JOIN DIAGNOSIS DI ON (A.APPT_ID=DI.APPT_ID) 
         JOIN PET P ON (A.PET_ID=P.PET_ID) 
    WHERE DI.CASE IN('Socialisation','Dental') 
    AND A.APPT_DATE <= DATE '2016-01-10' 
    GROUP BY D.DOC_ID, D.STATUS, A.APPT_DATE, A.APPT_ID, DI.CASE, P.PET_ID, P.PET_NAME; 
    

    另外,如果你打算使用日期文字,那麼你需要使用格式DATE 'YYYY-MM-DD'所以DATE '2016-01-10'

    然而,隨着Christian Palmer提到的,如果您想獲得至少兩個月大的條目,然後你可以使用:

    AND A.APPT_DATE <= ADD_MONTHS(SYSDATE, -2); 
    
    相關問題