查询中的char值和日期值比较

时间:2015-08-25 15:55:59

标签: sql oracle ora-01481

一列(txn_issue_dt)是char,issue_dt是日期,我试图比较这两个,但我是自学成才,我很难过,请帮助。

SELECT ptf.carrid,
       ptf.cov_effdt,
       ptf.cvg_id,
       ptf.err_msg,
       ptf.error_id,
       ptf.fine_dt,
       ptf.fine_id,
       ptf.fine_status,
       ptf.polnbr,
       ptf.txn_code,
       ptf.txn_type,
       ptf.rcvd_dt
FROM   policy_tracking_fine_view ptf
       INNER JOIN canc_rein cr ON cr.polnbr = ptf.polnbr
WHERE  ptf.txn_code = '05'
AND    ptf.fine_type = 'L'
AND    ptf.fine_status_descrip NOT IN ('SUSPENDED', 'VOID')
AND    TO_CHAR (ptf.txn_issue_dt, 'yy-mon-dd') = TO_DATE (cr.issue_dt, 'mm/dd/yy');

我收到了ORA-01481:无效的数字格式模型 和ORA-01861:文字与格式字符串

不匹配

2 个答案:

答案 0 :(得分:1)

当您比较两个日期时,最好两者都是DATE数据类型。

如果两列都已经处于DATE数据类型,那么您不必担心转换它们(尽管您可能需要担心是否需要TRUNC()日期到当天/月/年的开始/小时等);你可以把它们比作日期。

如果一个或多个列是一个字符串,那么您将不得不将其转换为DATE数据类型,您可以使用TO_DATE进行。

因此,在您的查询中,您似乎需要更改

AND TO_CHAR (ptf.txn_issue_dt, 'yy-mon-dd') = TO_DATE (cr.issue_dt, 'mm/dd/yy')

AND TO_DATE (ptf.txn_issue_dt, 'yy-mon-dd') = cr.issue_dt

显然,date-as-a string列的格式决定了你使用的格式掩码。看起来您的数据有两位数年份? (Ick,ick,ick,ick!就像Y2K从未发生过......)如果是这样,那么你可能最好使用'rr-mon-dd'的格式模板,以便更好地猜测是什么这一年的前两位是。

EG。如果您的字符串日期看起来像'23 / 08/2015',那么您可以TO_DATE(ptf.txn_issue_dt, 'dd/mm/yyyy')

NB。 从不对已经是DATE数据类型的内容执行TO_DATE();你已经引入了一个潜在的bug,因为Oracle必须在幕后进行隐式转换,这依赖于默认的nls_date_format参数,这可能会导致错误或返回错误的日期:

alter session set nls_date_format = 'dd/mm/yy hh24:mi:ss';

select to_char(to_date(sysdate, 'dd/mm/yyyy hh24:mi:ss'), 'dd/mm/yyyy hh24:mi:ss') dt from dual;

DT                 
-------------------
25/08/0015 12:25:20

答案 1 :(得分:0)

您将字符转换为字符(txt_issue_dt),将日期转换为日期。始终转换为相同的数据类型,因此如果您有不同的数据类型,请保持一个相同并转换另一个。 在你的情况下:

TO_DATE(ptf.txn_issue_dt,'')= cr.issue_dt

因此,如果txn_issue_dt的内容类似于2015-APR-01,则将' YYYY-MON-DD'作为比较左侧的格式掩码。

请记住,在列名周围放置函数会禁用该表上的索引使用。所以在我的例子中,sx解释器没有使用txn_issue_dt的索引。

相关问题