2016-12-05 64 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); 
    
    相关问题