我正在尝试针对测试数据库运行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');
如果有人可以指出正确的方向,我将不胜感激!
答案 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'), ' ')