【问题标题】:char value and date value comparison in query查询中的字符值和日期值比较
【发布时间】:2015-08-25 15:55:59
【问题描述】:

一列 (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: 文字与格式字符串不匹配

【问题讨论】:

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

标签: sql oracle ora-01481


【解决方案1】:

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

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

如果一个或多个列是字符串,那么您必须将其转换为 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

【讨论】:

    【解决方案2】:

    您正在将字符转换为字符 (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 上的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      相关资源
      最近更新 更多