0

一列(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:invalid number format model 和 ORA-01861: literal does not match format string

4

2 回答 2

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

显然,日期字符串列的格式决定了您使用的格式掩码。看起来您的数据有 2 位数的年份?(Ick,ick,ick,ick!这就像 Y2K 甚至从未发生过......)如果是这样,那么您最好使用 'rr-mon-dd' 格式掩码,以便更好地猜测什么年份的前两位数字是。

例如。如果你的字符串日期看起来像 '23/08/2015' 那么你会做TO_DATE(ptf.txn_issue_dt, 'dd/mm/yyyy')

注意。永远不要对已经是 DATE 数据类型的东西执行 TO_DATE() ;您引入了一个潜在的错误,因为 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
于 2015-08-25T16:12:13.293 回答
0

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

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

因此,如果 txn_issue_dt 的内容类似于 2015-APR-01,请将“yyyy-MON-dd”作为格式掩码放在比较的左侧。

请记住,将函数放在列名周围会禁用该表上的索引使用。因此,在我的示例中,sql 解释器不使用 txn_issue_dt 上的索引。

于 2015-08-25T16:11:20.423 回答