在获取Date和String参数时查询有问题

时间:2016-10-07 17:24:15

标签: sql oracle

我创建了一个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

2 个答案:

答案 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中有字母字符