我正在尝试在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;
答案 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';
这会强制使用标准格式的日期输入。
如果您希望仅将其输入为完整月份,则:
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;
同样在您的原始查询中,我看到日期,您是否尝试将日期'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)