一列(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:文字与格式字符串
不匹配答案 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的索引。