簡體   English   中英

SQL Clauuse日期-不是有效月份錯誤

[英]SQL Where Clauuse Date - Not A Valid Month Error

我試圖在SQL Developer(使用Oracle數據庫)中運行此sql查詢。 基本上,我想選擇給定的所有列,其中A.APPT_DATE至少存在2個月,但我不斷遇到“無效月份錯誤”-用粗體突出顯示此位。 如果我將此where子句刪除,它將正常工作。

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;

我不確定,但我想日期格式類似於DD-Mon-YYYY 因此,您需要這樣做: '10-JAN-2016'

讓我知道是否有幫助。

假設您的日期存儲在正確的數據類型DATE

您可以嘗試使用YYYY-MM-DD格式嗎?我希望它可以使用Datetime Literals使用

<= DATE '2016-01-10'

嘗試這個:

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

所以你與語言無關

2件事情:1.如果要使用標准方式,則日期應輸入為“ DD-Mon-YYYY”,例如“ 2016年1月1日”。

因此,您的查詢將是:

    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';

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

  1. 如果要僅將其輸入為整月,則:

     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,您是否嘗試將日期“ 2016年1月10日”轉換為一個比較日期? 在這種情況下,您需要像TO_DATE(“此處輸入您的日期”,“格式字符串”)一樣。 我之所以這樣問,是因為,請看下面的兩個查詢,第一個引發錯誤(與您得到的錯誤相同),第二個不引發錯誤:

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

這里的許多答案正確地指出,您需要使用TO_DATE函數將字符串轉換為日期,並且必須聲明格式。 但是,您的原始帖子說您要提取“至少兩個月前存在”的實體。 為此,我將使用:

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

那你明天就不用重寫查詢了

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 );

這對我有用:

cast (RN_EXECUTION_date as Date) >= '31-MAR-2018'

RN_EXECUTION_Date為日期時間戳格式。 使用cast功能,它轉換成日期的格式(DD-MON-YEAR)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM