ORACLE时间段查询优化的问题。
我建了一个表,里面有日期(RQ),时间(SJ)两个字段,都是DATE类型,我建立了一个查询,目的是找到两个日期之间所有的数据。我的SQL语句是这样写的:SELECTSID...
我建了一个表,里面有日期(RQ),时间(SJ)两个字段,都是DATE类型,我建立了一个查询,目的是找到两个日期之间所有的数据。
我的SQL语句是这样写的:
SELECT SID, SSJSID, RQ, SJ,
FROM JING_SS WHERE SID IN
(SELECT SID FROM JING_SS WHERE RQ IN( SELECT RQ FROM JING_SS WHERE TO_CHAR(RQ,'yyyyMMdd') BETWEEN 开始日期 AND 结束日期 ))
AND SID NOT IN (SELECT SID FROM JING_SS WHERE TO_CHAR(SJ,'HH24mmss') < 开始时间 AND TO_CHAR(RQ,'yyyyMMdd') = 开始日期 )
AND SID NOT IN (SELECT SID FROM JING_SS WHERE TO_CHAR(SJ,'HH24mmss') > 结束时间 AND TO_CHAR(RQ,'yyyyMMdd') = 结束日期)
AND SSJSID IN (SELECT SID FROM COM_DW CONNECT BY PRIOR SID = FID START WITH SID = 单位编号 )
ORDER BY SID;
在数据量少的时候查询速度还是能够忍受的,可是现在有大约60万条数据,时间就太长了,我想优化这条查询,请教专家谢谢!
这是网上朋友的另一个解决办法:
SELECT SID, SSJSID, RQ, SJ,
FROM JING_SS
WHERE TO_DATE(RQ || ' ' || SJ,'yyyy-mm-dd HH24:mi:ss')
BETWEEN TO_DATE(开始日期 || ' ' || 开始时间,'yyyy-mm-dd HH24:mi:ss')
and TO_DATE(结束日期 || ' ' || 结束时间,'yyyy-mm-dd HH24:mi:ss')
这个方法我试过了,在转换过程中会损失很多性能,效率反而不高。 展开
我的SQL语句是这样写的:
SELECT SID, SSJSID, RQ, SJ,
FROM JING_SS WHERE SID IN
(SELECT SID FROM JING_SS WHERE RQ IN( SELECT RQ FROM JING_SS WHERE TO_CHAR(RQ,'yyyyMMdd') BETWEEN 开始日期 AND 结束日期 ))
AND SID NOT IN (SELECT SID FROM JING_SS WHERE TO_CHAR(SJ,'HH24mmss') < 开始时间 AND TO_CHAR(RQ,'yyyyMMdd') = 开始日期 )
AND SID NOT IN (SELECT SID FROM JING_SS WHERE TO_CHAR(SJ,'HH24mmss') > 结束时间 AND TO_CHAR(RQ,'yyyyMMdd') = 结束日期)
AND SSJSID IN (SELECT SID FROM COM_DW CONNECT BY PRIOR SID = FID START WITH SID = 单位编号 )
ORDER BY SID;
在数据量少的时候查询速度还是能够忍受的,可是现在有大约60万条数据,时间就太长了,我想优化这条查询,请教专家谢谢!
这是网上朋友的另一个解决办法:
SELECT SID, SSJSID, RQ, SJ,
FROM JING_SS
WHERE TO_DATE(RQ || ' ' || SJ,'yyyy-mm-dd HH24:mi:ss')
BETWEEN TO_DATE(开始日期 || ' ' || 开始时间,'yyyy-mm-dd HH24:mi:ss')
and TO_DATE(结束日期 || ' ' || 结束时间,'yyyy-mm-dd HH24:mi:ss')
这个方法我试过了,在转换过程中会损失很多性能,效率反而不高。 展开
1个回答
展开全部
试试下面语句:
SELECT SID, SSJSID, RQ, SJ FROM JING_SS
Where to_char(rq,'yyyyMMdd') between 开始日期 and 结束日期 and
not to_char(sj,’hh24mmss')<开始时间and to_char(rq,'yyyyMMdd')=开始日期 and
not to_char(sj,'hh24mmss')>结束时间and to_char(rq,'yyyyMMdd')=结束日期 and
ssjsid in (select sid fromcom_dw connect by prior sid=fid start with sid=单位编号)
Order by sid;
SELECT SID, SSJSID, RQ, SJ FROM JING_SS
Where to_char(rq,'yyyyMMdd') between 开始日期 and 结束日期 and
not to_char(sj,’hh24mmss')<开始时间and to_char(rq,'yyyyMMdd')=开始日期 and
not to_char(sj,'hh24mmss')>结束时间and to_char(rq,'yyyyMMdd')=结束日期 and
ssjsid in (select sid fromcom_dw connect by prior sid=fid start with sid=单位编号)
Order by sid;
追问
您这个语句有些问题我稍作了下修改
SELECT SID, SSJSID, RQ, SJ FROM JING_SS
Where to_char(rq,'yyyyMMdd') between 开始日期 and 结束日期 and
not (to_char(sj,’hh24mmss')结束时间 and to_char(rq,'yyyyMMdd')=结束日期 )and
ssjsid in (select sid from com_dw connect by prior sid=fid start with sid=单位编号)
Order by sid;
追答
not优先级比 and 高,加括号是对的。
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询