【问题标题】:ora-01861 literal does not match format stringora-01861 文字与格式字符串不匹配
【发布时间】:2012-10-09 17:25:54
【问题描述】:
select contract.contract_id
from swcd.scd_contract contract 

left join SCD.COMPANY_TIMELINE_VIEW customer on (customer.company_id=contract.customer_company_id and to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '1-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '1-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '1-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '1-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') >= (CASE WHEN customer.EVENT_START_DATE is null THEN to_date('01-JAN-1901', 'DD-Mon-YYYY') else 
trunc(customer.EVENT_START_DATE) END) AND to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '1-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '1-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '1-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '1-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') <= (CASE WHEN customer.EVENT_END_DATE is null THEN to_date('01-JAN-2101', 'DD-Mon-YYYY') else 
trunc(customer.EVENT_END_DATE) END)) 

left join SCD.COMPANY_TIMELINE_VIEW vendor on (vendor.company_id=contract.vendor_company_id and to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '1-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '1-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '1-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '1-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') >= (CASE WHEN vendor.EVENT_START_DATE is null THEN to_date('01-JAN-1901', 'DD-Mon-YYYY') else
trunc(vendor.EVENT_START_DATE) END) AND to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '1-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '1-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '1-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '1-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') <= (CASE WHEN vendor.EVENT_END_DATE is null THEN to_date('01-JAN-2101', 'DD-Mon-YYYY') else 
trunc(vendor.EVENT_END_DATE) END));

这是我在 Oracle 10g 上执行的查询。这对我来说是一种奇怪的行为。 当我使用任何一个连接执行select 查询时,它工作正常,但是对于两个必需的连接,它都会显示ora-01861 literal does not match format string

-- Works fine
select contract.contract_id
from swcd.scd_contract contract 

left join SCD.COMPANY_TIMELINE_VIEW customer on (customer.company_id=contract.customer_company_id and to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '1-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '1-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '1-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '1-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') >= (CASE WHEN customer.EVENT_START_DATE is null THEN to_date('01-JAN-1901', 'DD-Mon-YYYY') else 
trunc(customer.EVENT_START_DATE) END) AND to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '1-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '1-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '1-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '1-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') <= (CASE WHEN customer.EVENT_END_DATE is null THEN to_date('01-JAN-2101', 'DD-Mon-YYYY') else 
trunc(customer.EVENT_END_DATE) END));

-- Works fine
select contract.contract_id
from swcd.scd_contract contract 
left join SCD.COMPANY_TIMELINE_VIEW vendor on (vendor.company_id=contract.vendor_company_id and to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '1-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '1-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '1-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '1-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') >= (CASE WHEN vendor.EVENT_START_DATE is null THEN to_date('01-JAN-1901', 'DD-Mon-YYYY') else
trunc(vendor.EVENT_START_DATE) END) AND to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '1-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '1-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '1-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '1-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') <= (CASE WHEN vendor.EVENT_END_DATE is null THEN to_date('01-JAN-2101', 'DD-Mon-YYYY') else 
trunc(vendor.EVENT_END_DATE) END));

请帮助我,任何答案将不胜感激。

Error report:
SQL Error: ORA-01861: literal does not match format string
01861. 00000 -  "literal does not match format string"
*Cause:    Literals in the input must be the same length as literals in
           the format string (with the exception of leading whitespace).  If the
           "FX" modifier has been toggled on, the literal must match exactly,
           with no extra whitespace.
*Action:   Correct the format string to match the literal.

【问题讨论】:

  • 你的 NLS_DATE_FORMAT 是什么?你能运行这个查询SELECT value FROM v$nls_parameters WHERE parameter ='NLS_DATE_FORMAT'; 吗?也许to_char(contract.ANNOUNCEMENT_DATE) 是它的原因,出于某种原因,这种“何时”只发生在某些执行计划中
  • 但是为什么它以单连接运行?
  • 正如我所说,也许,根据一些执行计划,它永远不会评估值to_char(contract.ANNOUNCEMENT_DATE)。另一件事,contract.ANNOUNCEMENT_YEAR 对于某些记录可以为空吗?
  • 感谢 AB 的关注 :) 现已解决。

标签: sql database oracle join oracle10g


【解决方案1】:
select contract.contract_id
from swcd.scd_contract contract 

left join SCD.COMPANY_TIMELINE_VIEW customer on (customer.company_id=contract.customer_company_id and to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '01-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '01-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '01-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '01-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') >= (CASE WHEN customer.EVENT_START_DATE is null THEN to_date('01-JAN-1901', 'DD-Mon-YYYY') else 
trunc(customer.EVENT_START_DATE) END) AND to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '01-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '01-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '01-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '01-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') <= (CASE WHEN customer.EVENT_END_DATE is null THEN to_date('01-JAN-2101', 'DD-Mon-YYYY') else 
trunc(customer.EVENT_END_DATE) END) 
and contract.customer_company_id is not null)

left join SCD.COMPANY_TIMELINE_VIEW vendor on (vendor.company_id=contract.vendor_company_id and to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '01-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '01-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '01-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '01-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') >= (CASE WHEN vendor.EVENT_START_DATE is null THEN to_date('01-JAN-1901', 'DD-Mon-YYYY') else
trunc(vendor.EVENT_START_DATE) END) AND to_char(to_date(case when contract.ANNOUNCEMENT_DATE is null then case when contract.ANNOUNCEMENT_QUARTER='Q1' then '01-JAN-' when contract.ANNOUNCEMENT_QUARTER='Q2' then '01-APR-'
when contract.ANNOUNCEMENT_QUARTER='Q3' then '01-JUL-' when contract.ANNOUNCEMENT_QUARTER='Q4' then '01-OCT-' end || contract.ANNOUNCEMENT_YEAR else to_char(contract.ANNOUNCEMENT_DATE) end),'dd-MON-YYYY') <= (CASE WHEN vendor.EVENT_END_DATE is null THEN to_date('01-JAN-2101', 'DD-Mon-YYYY') else 
trunc(vendor.EVENT_END_DATE) END) 
and contract.vendor_company_id is not null);

工作正常,连接子句中的id 列面临null 比较问题。所以在join 子句中添加了is not null,现在运行良好。

【讨论】:

    【解决方案2】:

    这似乎是数据库中的错误。无论如何,尝试将 '1-JUL-' 替换为 '01-JUL-' 等等。 您的选择在 ELSE 子句中使用了隐式格式转换 to_char(contract.ANNOUNCEMENT_DATE),这也可能是个问题。

    我会重写select尽可能避免转换,像这样

    select contract.contract_id
    from 
      (select contract_id, customer_company_id, vendor_company_id,
              nvl(ANNOUNCEMENT_DATE, 
                  add_months(trunc(to_date(ANNOUNCEMENT_YEAR,'yyyy'),'yyyy'),
                     case when contract.ANNOUNCEMENT_QUARTER='Q1' then 0
                          when contract.ANNOUNCEMENT_QUARTER='Q1' then 3
                          when contract.ANNOUNCEMENT_QUARTER='Q1' then 6
                          when contract.ANNOUNCEMENT_QUARTER='Q1' then 9
                     end)) quarter_start
         from swcd.scd_contract) contract
    left join SCD.COMPANY_TIMELINE_VIEW customer on
      (customer.company_id=contract.customer_company_id and
       contract.quarter_start between  nvl(trunc(customer.EVENT_START_DATE), to_date('01-JAN-1901', 'DD-Mon-YYYY')) AND
                                       nvl(trunc(customer.EVENT_END_DATE, to_date('01-JAN-2101', 'DD-Mon-YYYY')))) 
    left join SCD.COMPANY_TIMELINE_VIEW vendor on
      (vendor.company_id=contract.vendor_company_id and
       contract.quarter_start between  nvl(trunc(vendor.EVENT_START_DATE), to_date('01-JAN-1901', 'DD-Mon-YYYY')) AND
                                       nvl(trunc(vendor.EVENT_END_DATE, to_date('01-JAN-2101', 'DD-Mon-YYYY'))));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-24
      • 2015-01-11
      • 2010-11-26
      • 2014-04-27
      • 2014-11-30
      相关资源
      最近更新 更多