文字字符串与格式字符串不匹配

时间:2019-03-28 14:50:28

标签: sql oracle

我正在尝试针对测试数据库运行sql脚本。我收到“文字字符串与格式字符串不匹配”的错误-奇怪的是,我的一位同事在同一测试服务器上运行相同的查询,并且没有收到任何错误,只有当我运行它时,我才会收到错误。我对此事完全迷失了。我应该从这里去哪里?

我正在使用SQLPlus命令行运行查询。我在第一行收到错误:选择NVL .....

  select NVL(to_char(add_months(to_date(max(mem.birth_date)), + 780), 'yyyymmdd'), ' ')
    into local_turn_65_on
    from member mem
   where mem.member_id in (
         select cmr.member_id
         from case_member cmr
         where cmr.case_id = due_tasks_rec.case_id
           and cmr.current_row_ind = 'Y'
           and cmr.case_member_end_date = 29991231
           and cmr.case_member_role in ('AA','AB','AD','DP'))
     and mem.update_end_date = 29991231
     and mem.birth_date between
         (to_char(add_months(sysdate,-780), 'yyyymmdd'))
     and
         (to_char(add_months(sysdate,-780), 'yyyy') || '1231');

如果有人可以指出正确的方向,我将不胜感激!

2 个答案:

答案 0 :(得分:1)

  

数据类型为number(8)

然后,您需要指定将该数字转换为日期的格式模型;代替

to_date(max(mem.birth_date))

您需要这样做:

to_date(max(mem.birth_date), 'YYYYMMDD')

或更明确地:

to_date(to_char(max(mem.birth_date)), 'YYYYMMDD')

目前,您的代码依赖于当前会话的NLS设置来获取要使用的格式模型,并且错误表明该代码与您传递的值不匹配。您的同事之所以能够成功运行相同的查询,是因为他们的会话具有不同的NLS设置。这就是为什么您不应该依赖NLS设置(或隐式转换-它们通常一起使用)的原因,因为您无法控制其他人如何运行您的代码。

您可以通过以下示例看到效果:

alter session set nls_date_format = 'DD-Mon-RR';

with mem (birth_date) as (select 20190328 from dual)
select NVL(to_char(add_months(to_date(max(mem.birth_date)), + 780), 'yyyymmdd'), ' ')
from mem;

ORA-01861: literal does not match format string

或更简单:

with mem (birth_date) as (select 20190328 from dual)
select to_date(max(mem.birth_date))
from mem;

ORA-01861: literal does not match format string

添加格式模型会产生一个日期:

with mem (birth_date) as (select 20190328 from dual)
select to_date(max(mem.birth_date), 'YYYYMMDD')
from mem;

TO_DATE(M
---------
28-Mar-19

您的调整和转换现在也可以使用:

with mem (birth_date) as (select 20190328 from dual)
select NVL(to_char(add_months(to_date(max(mem.birth_date), 'YYYYMMDD'), + 780), 'yyyymmdd'), ' ')
from mem;

NVL(TO_C
--------
20840328

您还应该将日期存储为日期,而不是数字,但这是一个单独的问题...

答案 1 :(得分:0)

我猜想另外一个to_char必须已经解决了仅使数字格式成为字符串然后使用to_date并加上月份的问题。

select NVL(to_char(add_months(to_date(to_char(max(mem.birth_date))), + 780), 'yyyymmdd'), ' ')