我创建了一个sql查询,其中我将参数传递给下面共享的部分
BETWEEN
NVL(TO_CHAR(:DATE1, 'DD-MON-YYYY'), DATETIME)
AND
NVL(TO_CHAR(:DATE2, 'DD-MON-YYYY'), DATETIME)
当我使用数据类型运行此查询时,它工作正常但是当我使用VARCHAR2
参数运行此查询时,它会出现以下错误:
[错误]执行(9:25):ORA-01722:无效数字
当我使用null运行此查询时,查询会显示所有记录。
实际上我需要使用STRING
参数而不是DATE
dataype运行此查询,因此当我将参数传递给toad中的同一查询时,即使使用null
值也能正常工作。
这是我的完整查询:
SELECT rownum,ACCOUNT_NO,CUSTOMER_NAME,CARD_NO, SOURCE, ATM_ID, ISSUER_BANK_NAME,ASE.STATUS_DESC, CARD_TYPE, CARD_RESP,
DATETIME,BR_INPUT_DATE BR_ACTIVITY
FROM ATM_RCCM, ATM_STATUS_ERRORS ASE
where ASE.STATUS_DESC = NVL(:PT, ASE.STATUS_DESC)
AND BR_TRACKING_STATUS = ASE.STATUS_CODE
AND CARD_TYPE = NVL(:CT, CARD_TYPE)
AND DATETIME
BETWEEN
NVL(TO_CHAR(:DATE1, 'DD-MON-YYYY'), DATETIME)
AND
NVL(TO_CHAR(:DATE2, 'DD-MON-YYYY'), DATETIME)
另请注意,DATETIME
列的默认数据类型为VARCHAR2
。
答案 0 :(得分:1)
基本亲爱的Watson:TO_CHAR将日期转换为varchar2。如果你给它错误的数据类型,为什么你期望它工作?当你给它一个varchar2输入时,它(在我看来是愚蠢的)尝试先将它转换为日期,而不是抛出编译错误。它将使用您的会话的NLS_DATE_FORMAT,而不是您在TO_CHAR中的格式模型。因此,在您的情况下,它不会引发运行时错误。
无论如何,这种比较是错误的;很明显你想要比较日期,而不是字符串。那么为什么要先将日期转换为字符串,然后进行比较呢?通过字符串比较,2012年1月12日是在1993年3月9日之前。
您是否只想使用TO_DATE,而不是TO_CHAR?试一试看看会发生什么!只需确保使用适当的格式模型将DATETIME包装在TO_DATE中。
答案 1 :(得分:0)
您输入的参数必须存在问题。可能你的:DATE1或:DATE2格式不正确,或者您可能在CT或PT中有字母字符