使用和或在其中的dere子句中的日期

问题描述 投票:0回答:1
我正在收到此错误消息:无法将包含%s的字符串值转换为一个数字:%s

如果我删除查询中的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');

fix的解释 括号:分组
sql oracle-database date where-clause between
1个回答
0
投票
条件。 确保trans_dt是一个日期:如果将trans_dt存储为varchar,请确保所有值都以正确的日期格式,然后使用

TO_DATE()

转换。如果trans_dt已经是日期,则不需要

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')。
    
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.