[英]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'
讓我知道是否有幫助。
嘗試這個:
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';
這將強制使用日期輸入的標准格式。
如果要僅將其輸入為整月,則:
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.