如果我删除查询中的trans_dt条件之一,则可以使用。当两个trans_dt条件都存在时,它会失败。
查询中的问题可能是由于操作员的优先级以及条件在WHERE子句中分组的方式。此外,请确保trans_dt实际上是在数据库中存储的日期类型。 fix:使用括号正确地分组条件 和运算符的优先级高于OR,因此您的send_id = 1020条件仅应用于第二个trans_dt条件,而不是两者兼而有之。您需要使用括号明确将trans_dt条件分组:
SELECT userId, COUNT(*), TO_DATE(trans_dt, 'DD-MON-RR')
FROM msgstore
WHERE (trans_dt BETWEEN TO_DATE('08-FEB-25', 'DD-MON-RR') AND TO_DATE('20-FEB-25', 'DD-MON-RR')
OR trans_dt = TO_DATE('02-FEB-24', 'DD-MON-RR'))
AND SEND_ID = 1020
GROUP BY userId, TO_DATE(trans_dt, 'DD-MON-RR');
TO_DATE()
TO_DATE(trans_dt, 'DD-MON-RR')
SELECT
子句中。
Error原因:如果Trans_DT是VARCHAR,并且包含无效的值,则TO_DATE()可能会失败。您可以使用以下方式检查此类情况: 选择了从msgstore选择不同的trans_dt,其中不regexp_like(trans_dt,'^[0-9] {2} - [a-z] {3} {3} - [0-9] [0-9] {2} $'); 替代方案:确保trans_dt是日期 如果将trans_dt存储为varchar,请在其中的子句中转换一次:
WHERE (TO_DATE(trans_dt, 'DD-MON-RR') BETWEEN TO_DATE('08-FEB-25', 'DD-MON-RR')
AND TO_DATE('20-FEB-25', 'DD-MON-RR')
OR TO_DATE(trans_dt, 'DD-MON-RR') = TO_DATE('02-FEB-24', 'DD-MON-RR'))
AND SEND_ID = 1020
确保将trans_dt正确解释为日期。如果该列已经是类型日期,请从select子句中删除to_date(trans_dt,'dd-mon-rr')。