请助:ORA-01841错误

qjxxzx 2008-07-10 03:57:04
我写的条SQL,但是运行时出错了,问题是:以下"红字"部份我必须采用变量的形式,运行出错的SQL在以下第一段,(第二段是在第一段基础上变:红字部份改为了常量,就不会出错了.不知道第一条语句有什么问题,请助各位帮助!)

--运行出错
select * from (
select DM,DMMC,to_date(JKM,'YYYY.MM.DD') AS SSSQ_Q,to_date(BCM,'YYYY.MM.DD') AS SSSQ_Z
From TNCS01 where DMLB='NSSBBD' and dm in (select SBLX_DM from TNSB01 where NSRDZDAH=500105000001247173 and
((to_date('2008.06.01','YYYY.MM.DD') Between YXQ_Q and YXQ_Z) or YXQ_Z is null))
) A
where to_date('2008.06.01','YYYY.MM.DD') Between SSSQ_Q AND SSSQ_Z



--运行正常
select * from (
select DM,DMMC,to_date(JKM,'YYYY.MM.DD') as SSSQ_Q,
to_date(BCM,'YYYY.MM.DD') as SSSQ_Z from TNCS01 where DMLB='NSSBBD' and dm in (select SBLX_DM from TNSB01 where NSRDZDAH=500105000001247173 and
((to_date('2008.06.01','YYYY.MM.DD') Between YXQ_Q and YXQ_Z) or YXQ_Z is null))
) AAA
where to_date('2008.06.01','YYYY.MM.DD') Between to_date('2008.06.01','YYYY.MM.DD') AND to_date('2008.06.30','YYYY.MM.DD')
...全文
5411 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qjxxzx 2008-07-10
  • 打赏
  • 举报
回复
首先感谢以上兄弟们的帮助,虽然没有解决问题。

我刚刚改了一下: (修改成为以下格式就没有问题,但不是明白,为什么加上"红字"部份就是不成功,是否与系统的变量环境有关系。)

--运行出错
select * from (
select DM,DMMC,to_date(JKM,'YYYY.MM.DD') AS SSSQ_Q,to_date(BCM,'YYYY.MM.DD') AS SSSQ_Z
From TNCS01 where DMLB='NSSBBD' and dm in (select SBLX_DM from TNSB01 where NSRDZDAH=500105000001247173 and
((to_date('2008.06.01','YYYY.MM.DD') Between YXQ_Q and YXQ_Z) or YXQ_Z is null))
) A
where to_date('2008.06.01','YYYY.MM.DD') Between SSSQ_Q AND SSSQ_Z

修改成为:

select DM,DMMC,to_date(JKM,'YYYY.MM.DD') AS SSSQ_Q,to_date(BCM,'YYYY.MM.DD') AS SSSQ_Z
From TNCS01 where DMLB='NSSBBD' and dm in (select SBLX_DM from TNSB01 where NSRDZDAH=500105000001247173 and
((to_date('2008.06.01','YYYY.MM.DD') Between YXQ_Q and YXQ_Z) or YXQ_Z is null))
and to_date('2008.06.01','YYYY.MM.DD') Between JCK AND BCM
oracledbalgtu 2008-07-10
  • 打赏
  • 举报
回复
上面搞错了,下面的试试:
建议改成如下试试:
SELECT TNCS01.DM,
TNCS01.DMMC,
TO_DATE(TNCS01.JKM, 'YYYY.MM.DD') AS SSSQ_Q,
TO_DATE(TNCS01.BCM, 'YYYY.MM.DD') AS SSSQ_Z
FROM TNCS01
WHERE TNCS01.DMLB = 'NSSBBD'
AND EXISTS (SELECT SBLX_DM
FROM TNSB01
WHERE NSRDZDAH = 500105000001247173
AND TNCS01.DM = SBLX_DM
AND ((TO_DATE('2008.06.01', 'YYYY.MM.DD') BETWEEN
YXQ_Q AND YXQ_Z) OR YXQ_Z IS NULL))
AND '2008.06.01' BETWEEN JKM AND BCM;



[Quote=引用 10 楼 oracledbalgtu 的回复:]
建议改成如下试试:
SELECT TNCS01.DM,
TNCS01.DMMC,
TO_DATE(TNCS01.JKM, 'YYYY.MM.DD') AS SSSQ_Q,
TO_DATE(TNCS01.BCM, 'YYYY.MM.DD') AS SSSQ_Z
FROM TNCS01
WHERE TNCS01.DMLB = 'NSSBBD'
AND EXISTS (SELECT SBLX_DM
FROM TNSB01
WHERE NSRDZDAH = 500105000001247173
AND TNCS01.DM = SBLX_DM
AND ((TO_DATE('2008.06.01', 'YYYY.MM.D…
[/Quote]
oracledbalgtu 2008-07-10
  • 打赏
  • 举报
回复
建议改成如下试试:
SELECT TNCS01.DM,
TNCS01.DMMC,
TO_DATE(TNCS01.JKM, 'YYYY.MM.DD') AS SSSQ_Q,
TO_DATE(TNCS01.BCM, 'YYYY.MM.DD') AS SSSQ_Z
FROM TNCS01
WHERE TNCS01.DMLB = 'NSSBBD'
AND EXISTS (SELECT SBLX_DM
FROM TNSB01
WHERE NSRDZDAH = 500105000001247173
AND TNCS01.DM = SBLX_DM
AND ((TO_DATE('2008.06.01', 'YYYY.MM.DD') BETWEEN
YXQ_Q AND YXQ_Z) OR YXQ_Z IS NULL))
AND '2008/06/01' BETWEEN SSSQ_Q AND SSSQ_Z;

[Quote=引用 5 楼 qjxxzx 的回复:]
三楼的,谢谢,但是我表中记录是以下格式,且都是:日期型

SSSQ_Q SSSQ_Z
1900/01/01 2222/12/31

[/Quote]
清秋伊叶 2008-07-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dhgdreeiq 的回复:]
那就要 to_date(SSSQ,'YYYY/MM/DD')了
[/Quote]
我应该是看错了


qjxxzx 2008-07-10
  • 打赏
  • 举报
回复
7 楼的,不行哟,,我才试的,关键是:

--运行正常
select * from (
select DM,DMMC,to_date(JKM,'YYYY.MM.DD') as SSSQ_Q,
to_date(BCM,'YYYY.MM.DD') as SSSQ_Z from TNCS01 where DMLB='NSSBBD' and dm in (select SBLX_DM from TNSB01 where NSRDZDAH=500105000001247173 and
((to_date('2008.06.01','YYYY.MM.DD') Between YXQ_Q and YXQ_Z) or YXQ_Z is null))
) AAA
where to_date('2008.06.01','YYYY.MM.DD') Between to_date('2008.06.01','YYYY.MM.DD') AND to_date('2008.06.30','YYYY.MM.DD')

这条语句都可以运行成功,这条语句与运行出错的那一条就是: 红色的部份不同,一个是变量,一个是常量

--运行出错
select * from (
select DM,DMMC,to_date(JKM,'YYYY.MM.DD') AS SSSQ_Q,to_date(BCM,'YYYY.MM.DD') AS SSSQ_Z
From TNCS01 where DMLB='NSSBBD' and dm in (select SBLX_DM from TNSB01 where NSRDZDAH=500105000001247173 and
((to_date('2008.06.01','YYYY.MM.DD') Between YXQ_Q and YXQ_Z) or YXQ_Z is null))
) A
where to_date('2008.06.01','YYYY.MM.DD') Between SSSQ_Q AND SSSQ_Z
清秋伊叶 2008-07-10
  • 打赏
  • 举报
回复
那就要 to_date(SSSQ,'YYYY/MM/DD')了
qjxxzx 2008-07-10
  • 打赏
  • 举报
回复
且上面运行出错的语句在:delphi 是运行不会出错,只是没有结果!
qjxxzx 2008-07-10
  • 打赏
  • 举报
回复
三楼的,谢谢,但是我表中记录是以下格式,且都是:日期型

SSSQ_Q SSSQ_Z
1900/01/01 2222/12/31
zjkk1011 2008-07-10
  • 打赏
  • 举报
回复
应该是有的字段里的日期超出了范围
oracledbalgtu 2008-07-10
  • 打赏
  • 举报
回复
SSSQ_Q AND SSSQ_Z列是日期类型的值吗?


[Quote=引用楼主 qjxxzx 的帖子:]
我写的条SQL,但是运行时出错了,问题是:以下"红字"部份我必须采用变量的形式,运行出错的SQL在以下第一段,(第二段是在第一段基础上变:红字部份改为了常量,就不会出错了.不知道第一条语句有什么问题,请助各位帮助!)

--运行出错
select * from (
select DM,DMMC,to_date(JKM,'YYYY.MM.DD') AS SSSQ_Q,to_date(BCM,'YYYY.MM.DD') AS SSSQ_Z
From TNCS01 where DMLB='NSSBBD' and dm in (select SBLX_DM from TNSB…
[/Quote]
oracledbalgtu 2008-07-10
  • 打赏
  • 举报
回复
ORA-01841的意思是你给出的日期值不对,日期值必须在:January 1, 4712 B.C. and December 31, 9999 A.D.之间。
所以需要修改你给出的值,并且需要给出date类型的值。
例子如下:
SELECT * FROM v$session s WHERE s.LOGON_TIME
BETWEEN &START AND &END;

在提示中给出:sysdate-1和sysdate,就会给出结果。


[Quote=引用楼主 qjxxzx 的帖子:]
我写的条SQL,但是运行时出错了,问题是:以下"红字"部份我必须采用变量的形式,运行出错的SQL在以下第一段,(第二段是在第一段基础上变:红字部份改为了常量,就不会出错了.不知道第一条语句有什么问题,请助各位帮助!)

--运行出错
select * from (
select DM,DMMC,to_date(JKM,'YYYY.MM.DD') AS SSSQ_Q,to_date(BCM,'YYYY.MM.DD') AS SSSQ_Z
From TNCS01 where DMLB='NSSBBD' and dm in (select SBLX_DM from TNSB…
[/Quote]
qjxxzx 2008-07-10
  • 打赏
  • 举报
回复
说明一下,第一条语句中的"兰色"部份单独运行是没有问题的,
--运行出错
select * from (
select DM,DMMC,to_date(JKM,'YYYY.MM.DD') AS SSSQ_Q,to_date(BCM,'YYYY.MM.DD') AS SSSQ_Z
From TNCS01 where DMLB='NSSBBD' and dm in (select SBLX_DM from TNSB01 where NSRDZDAH=500105000001247173 and
((to_date('2008.06.01','YYYY.MM.DD') Between YXQ_Q and YXQ_Z) or YXQ_Z is null))

) A
where to_date('2008.06.01','YYYY.MM.DD') Between SSSQ_Q AND SSSQ_Z

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧