SQL Clauuse日期 - 不是有效月错误

时间:2016-12-05 10:42:11

标签: sql database oracle date where-clause

我正在尝试在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;

5 个答案:

答案 0 :(得分:0)

我不确定,但我猜日期格式与<clip>类似。所以你需要这样做:<item>

如果有帮助,请告诉我。

答案 1 :(得分:0)

to_DATE('10-01-2016','DD-MM-YYYY')

所以你不依赖于语言

答案 2 :(得分: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';

这会强制使用标准格式的日期输入。

  1. 如果您希望仅将其输入为完整月份,则:

    ALTER SESSION SET nls_date_format = 'DD-Month-YYYY';
    
  2. 然后运行您的查询:

        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;
    

    同样在您的原始查询中,我看到日期,您是否尝试将日期'10 -Jan-2016'投放到比较日期?在这种情况下,你需要它像TO_DATE('你的日期在这里','格式字符串')。 为什么我问这是因为,看看下面的两个查询,首先抛出错误(与你得到的相同),第二个不是:

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

答案 3 :(得分:0)

这里的很多答案都指出你需要使用TO_DATE函数将字符串转换为日期,并且必须说明格式。但是,您的原始帖子表示您要提取至少两个月大的实体&#39;。为此,我会使用:

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

然后你不需要明天重新编写你的查询

答案 4 :(得分:0)

这对我有用:

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

RN_EXECUTION_Date采用日期时间戳格式。使用cast函数,将其转换为日期格式(DD-MON-YEAR)