PL/SQL中查询某个时间段的记录(between...and..函数,Trunc函数,To_date函数)

本文介绍三种在SQL中进行日期查询的方法:使用between...and...函数结合trunc进行时间段查询,直接利用trunc函数精确到指定日期,以及不使用任何函数直接比较日期。文章通过实例展示了如何灵活运用这些技巧,以提高查询效率。

1.以下是用between ...and...函数

主要是用到了trunc函数和between  and来查询某个时间段的记录;

SELECT *
FROM IFSAPP.SHOP_ORD A
WHERE A.contract='PPCD'
and A.EARLIEST_START_DATE between trunc(sysdate-12) and trunc(sysdate-5)

Y

2.直接得用Trunc函数

select * from IFSAPP.SHOP_ORDER_OPERATION  
where trunc(last_activity_date)=to_date('2019/11/11','YYYY/MM/DD')

3.不用任何函数(一般日期列都会有索引,使用函数后要走索引必须要建函数索引)

select * from IFSAPP.SHOP_ORDER_OPERATION  
where last_activity_date >= date '2019-11-11' and last_activity_date < date '2019-11-12' --'YEAR-MONTH-DATE'(这个格式才可以,其它格式不可以)

2和3都实现以下的结果

a:另外日期可以写成(Date '2019-11-11'')格式

b:To_date函数,就是转化成日期函数;to_date('2019/11/11','YYYY/MM/DD')

 

 

 

 

 

 

参考文档

https://blog.youkuaiyun.com/qq_34120041/article/details/54600802

如下oracle的PROCEDURE测试时报错,[Error] (0: 0): PL/SQL: Compilation unit analysis terminated [Error] PLS-00208 (24: 76): PLS-00208: identifier 'TYPE' is not a legal cursor attribute 请协助修正 CREATE OR REPLACE PROCEDURE LPBD7.SP_INSERT_AGENCY_LOGS_ORT AS -- 类型定义保持不变 TYPE t_rec IS RECORD ( event AGENCY_LOGS_JSON.EVENT%TYPE, agent_id AGENCY_LOGS_JSON.AGENT_ID%TYPE, serials_band AGENCY_LOGS_JSON.SERIALS_BAND%TYPE, serials_sp AGENCY_LOGS_JSON.SERIALS_SP%TYPE, serials_bg AGENCY_LOGS_JSON.SERIALS_BG%TYPE, serials_fg AGENCY_LOGS_JSON.SERIALS_FG%TYPE, test_name VARCHAR2(200), created AGENCY_LOGS_JSON.CREATED%TYPE, insertd AGENCY_LOGS_JSON.INSERTD%TYPE, station_id AGENCY_LOGS_JSON.STATION_ID%TYPE, id AGENCY_LOGS_JSON.ID%TYPE, json AGENCY_LOGS_JSON.JSON%TYPE, sample_type VARCHAR2(200), clean_test VARCHAR2(500) ); TYPE t_rec_tab IS TABLE OF t_rec; v_data t_rec_tab; v_params SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST(); v_last_id AGENCY_LOGS_JSON.ID%TYPE; -- 使用%TYPE确保类型一致 v_new_last_id AGENCY_LOGS_JSON.ID%TYPE := CASE WHEN AGENCY_LOGS_JSON.ID%TYPE = 'NUMBER' THEN 0 ELSE '0' END; v_msg VARCHAR2(4000); V_RESULT VARCHAR2(500); v_max_datetime DATE; -- 用于安全处理日期 BEGIN -- 修复1:确保状态表查询使用正确的过程名 BEGIN SELECT last_id INTO v_last_id FROM LPBD7.PROC_SYNC_STATUS WHERE proc_name = 'SP_INSERT_AGENCY_LOGS_ORT'; -- 名称保持一致 EXCEPTION WHEN NO_DATA_FOUND THEN v_last_id := CASE WHEN AGENCY_LOGS_JSON.ID%TYPE = 'NUMBER' THEN 0 ELSE '0' END; END; -- 预加载参数值(保持不变) SELECT REGEXP_REPLACE(VALUE1, '[^[:alnum:] ]', '') BULK COLLECT INTO v_params FROM LPBD7.U_PARAMETER_FILE WHERE CONDITION1 = 'ORT_EBORD' AND ACTIVE = 'Y' GROUP BY REGEXP_REPLACE(VALUE1, '[^[:alnum:] ]', ''); -- 修复2:安全的日期处理 BEGIN SELECT MAX(LAST_DATETIME) INTO v_max_datetime FROM LP960.TC_AGENCY_JOB_LOG WHERE EXECUTETIME > SYSDATE - 0.5 AND JOBNAME = 'AgencyAPI_Lobs_Json'; EXCEPTION WHEN NO_DATA_FOUND THEN v_max_datetime := CASE WHEN SYSDATE BETWEEN TRUNC (SYSDATE) + 8.5/24 AND TRUNC (SYSDATE) + 20.5/24 THEN TRUNC (SYSDATE) + 8.5/24 WHEN SYSDATE BETWEEN TRUNC (SYSDATE) + 20.5/24 AND TRUNC (SYSDATE+1) THEN TRUNC (SYSDATE) + 20.5/24 WHEN SYSDATE BETWEEN TRUNC (SYSDATE-1) AND TRUNC (SYSDATE) + 8.5/24 THEN TRUNC (SYSDATE - 1) + 20.5 / 24 END; END; -- 批量获取待处理数据(使用安全的日期变量) SELECT h.EVENT, h.AGENT_ID, h.SERIALS_BAND, h.SERIALS_SP, h.SERIALS_BG, h.SERIALS_FG, JSON_VALUE(h.JSON, '$.insight.results.test'), h.CREATED, h.INSERTD, h.STATION_ID, h.ID, h.JSON, JSON_VALUE(h.JSON, '$.insight.uut_attributes.sample_type'), UPPER(REGEXP_REPLACE(JSON_VALUE(h.JSON, '$.insight.results.test'), '[^[:alnum:] ]', '')) BULK COLLECT INTO v_data FROM LPBD7.AGENCY_LOGS_JSON h JOIN MESNEX.AGENCY_JOBS j ON h.AGENT_ID = j.AGENT JOIN MESNEX.AGENCY_PROCESS p ON j.PROCESS = p.ID WHERE UPPER(p.NAME) = 'ORT-RAW' AND j.DISABLED = 'False' AND h.CREATED BETWEEN j.STARTED AND j.ENDED AND h.ID > v_last_id AND h.CREATED >= NVL(v_max_datetime, SYSDATE - 30) - INTERVAL '20' MINUTE -- 安全日期运算 ORDER BY h.ID; IF v_data.COUNT > 0 THEN v_new_last_id := v_data(v_data.LAST).id; -- 批量插入处理(保持不变) FOR i IN 1..v_data.COUNT LOOP FOR j IN 1..v_params.COUNT LOOP CONTINUE WHEN v_params(j) IS NULL; IF INSTR(v_data(i).clean_test, UPPER(v_params(j))) > 0 THEN -- 查重后插入 INSERT INTO LPBD7.AGENCY_LOGS_ORT ( EVENT, AGENT_ID, SERIALS_BAND, SERIALS_SP, SERIALS_BG, SERIALS_FG, TEST_NAME, CREATED, INSERTD, STATION_ID, ID ) SELECT v_data(i).event, v_data(i).agent_id, v_data(i).serials_band, v_data(i).serials_sp, v_data(i).serials_bg, v_data(i).serials_fg, v_data(i).test_name, v_data(i).created, v_data(i).insertd, v_data(i).station_id, v_data(i).id FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM LPBD7.AGENCY_LOGS_ORT o WHERE o.ID = v_data(i).id AND o.TEST_NAME = v_data(i).test_name ); -- 调用存储过程 LPBD7.SP_LOG_ORT_INSERT_EVENT( v_data(i).serials_band, v_data(i).serials_sp, v_data(i).serials_bg, v_data(i).serials_fg, v_data(i).id, v_data(i).created, v_data(i).test_name, v_data(i).event, v_data(i).json, v_data(i).sample_type ); EXIT; -- 匹配后跳出参数循环 END IF; END LOOP; END LOOP; -- 修复3:更新状态时使用正确过程名 MERGE INTO LPBD7.PROC_SYNC_STATUS dst USING (SELECT 'SP_INSERT_AGENCY_LOGS_ORT' proc_name FROM DUAL) src -- 名称一致 ON (dst.proc_name = src.proc_name) WHEN MATCHED THEN UPDATE SET last_id = v_new_last_id WHEN NOT MATCHED THEN INSERT (proc_name, last_id) VALUES (src.proc_name, v_new_last_id); COMMIT; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; v_msg := SQLERRM; SELECT SAJET.SF_MES_Send_Mail( 'mes.it@tzlens.com,yujia.liu@tzlens.com', 'SP_INSERT_AGENCY_LOGS_ORT ERROR: ' || SUBSTR(v_msg, 1, 4000), 'STORED PROCEDURE ERROR', '', '', '' ) INTO V_RESULT FROM DUAL; RAISE; END;
最新发布
09-20
如下oracle的PROCEDURE报错,[Error] ORA-00942 (62: 45): PL/SQL: ORA-00942: table or view does not exist 请协助修正 CREATE OR REPLACE PROCEDURE LPBD7.SP_INSERT_AGENCY_LOGS_ORT AS TYPE t_rec IS RECORD ( event AGENCY_LOGS_JSON.EVENT%TYPE, agent_id AGENCY_LOGS_JSON.AGENT_ID%TYPE, serials_band AGENCY_LOGS_JSON.SERIALS_BAND%TYPE, serials_sp AGENCY_LOGS_JSON.SERIALS_SP%TYPE, serials_bg AGENCY_LOGS_JSON.SERIALS_BG%TYPE, serials_fg AGENCY_LOGS_JSON.SERIALS_FG%TYPE, test_name VARCHAR2(200), created AGENCY_LOGS_JSON.CREATED%TYPE, insertd AGENCY_LOGS_JSON.INSERTD%TYPE, station_id AGENCY_LOGS_JSON.STATION_ID%TYPE, id AGENCY_LOGS_JSON.ID%TYPE, json AGENCY_LOGS_JSON.JSON%TYPE, sample_type VARCHAR2(200), clean_test VARCHAR2(500) ); TYPE t_rec_tab IS TABLE OF t_rec; v_data t_rec_tab; v_params SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST(); v_last_id NUMBER; v_new_last_id NUMBER := 0; v_msg VARCHAR2(4000); V_RESULT VARCHAR2(500); BEGIN -- 获取上次处理位置 BEGIN SELECT last_id INTO v_last_id FROM LPBD7.PROC_SYNC_STATUS WHERE proc_name = 'PROC_SYNC_AGENCY_LOGS_ORT'; EXCEPTION WHEN NO_DATA_FOUND THEN v_last_id := 0; END; -- 预加载参数值 SELECT REGEXP_REPLACE(VALUE1, '[^[:alnum:] ]', '') BULK COLLECT INTO v_params FROM LPBD7.U_PARAMETER_FILE WHERE CONDITION1 = 'ORT_EBORD' AND ACTIVE = 'Y' GROUP BY REGEXP_REPLACE(VALUE1, '[^[:alnum:] ]', ''); -- 批量获取待处理数据 SELECT h.EVENT, h.AGENT_ID, h.SERIALS_BAND, h.SERIALS_SP, h.SERIALS_BG, h.SERIALS_FG, JSON_VALUE(h.JSON, '$.insight.results.test'), h.CREATED, h.INSERTD, h.STATION_ID, h.ID, h.JSON, JSON_VALUE(h.JSON, '$.insight.uut_attributes.sample_type'), UPPER(REGEXP_REPLACE(JSON_VALUE(h.JSON, '$.insight.results.test'), '[^[:alnum:] ]', '')) BULK COLLECT INTO v_data FROM LPBD7.AGENCY_LOGS_JSON h JOIN MESNEX.AGENCY_JOBS j ON h.AGENT_ID = j.AGENT JOIN MESNEX.AGENCY_PROCESS p ON j.PROCESS = p.ID WHERE UPPER(p.NAME) = 'ORT-RAW' AND j.DISABLED = 'False' AND h.CREATED BETWEEN j.STARTED AND j.ENDED AND h.ID > v_last_id AND h.CREATED >= TO_DATE((SELECT MAX(TO_CHAR(A.LAST_DATETIME,'yyyy/mm/dd hh24:mi:ss')) FROM LP960.TC_AGENCY_JOB_LOG A WHERE A.EXECUTETIME > SYSDATE-0.5 AND A.JOBNAME = 'AgencyAPI_Lobs_Json'),'yyyy/mm/dd hh24:mi:ss') - 10 / 1440 -- 处理TRACE同步最新时间内数据 ORDER BY h.ID; IF v_data.COUNT > 0 THEN v_new_last_id := v_data(v_data.LAST).id; -- 批量插入处理 FOR i IN 1..v_data.COUNT LOOP FOR j IN 1..v_params.COUNT LOOP CONTINUE WHEN v_params(j) IS NULL; IF INSTR(v_data(i).clean_test, UPPER(v_params(j))) > 0 THEN -- 查重后插入 INSERT INTO LPBD7.AGENCY_LOGS_ORT ( EVENT, AGENT_ID, SERIALS_BAND, SERIALS_SP, SERIALS_BG, SERIALS_FG, TEST_NAME, CREATED, INSERTD, STATION_ID, ID ) SELECT v_data(i).event, v_data(i).agent_id, v_data(i).serials_band, v_data(i).serials_sp, v_data(i).serials_bg, v_data(i).serials_fg, v_data(i).test_name, v_data(i).created, v_data(i).insertd, v_data(i).station_id, v_data(i).id FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM LPBD7.AGENCY_LOGS_ORT o WHERE o.ID = v_data(i).id AND o.TEST_NAME = v_data(i).test_name ); -- 调用存储过程 LPBD7.SP_LOG_ORT_INSERT_EVENT( v_data(i).serials_band, v_data(i).serials_sp, v_data(i).serials_bg, v_data(i).serials_fg, v_data(i).id, v_data(i).created, v_data(i).test_name, v_data(i).event, v_data(i).json, v_data(i).sample_type ); EXIT; -- 匹配后跳出参数循环 END IF; END LOOP; END LOOP; -- 更新处理位置 MERGE INTO LPBD7.PROC_SYNC_STATUS dst USING (SELECT 'PROC_SYNC_AGENCY_LOGS_ORT' proc_name FROM DUAL) src ON (dst.proc_name = src.proc_name) WHEN MATCHED THEN UPDATE SET last_id = v_new_last_id WHEN NOT MATCHED THEN INSERT (proc_name, last_id) VALUES (src.proc_name, v_new_last_id); COMMIT; END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; v_msg := SQLERRM; SELECT SAJET.SF_MES_Send_Mail( 'mes.it@tzlens.com,yujia.liu@tzlens.com', 'SP_INSERT_AGENCY_LOGS_ORT ERROR: ' || SUBSTR(v_msg, 1, 4000), 'STORED PROCEDURE ERROR', '', '', '' )INTO V_RESULT FROM DUAL; RAISE; END; /
09-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值