1 概述
- 使用场景: 当一段 sql 查询时间太长时,可以 分时间段 进行查询,如:按年查询、按月查询等
2 源码
DECLARE
v_start_date DATE := DATE '2017-01-01';
v_end_date DATE := DATE '2020-09-30';
v_temp_date DATE;
v_cycles PLS_INTEGER;
BEGIN
v_cycles := ceil(months_between(v_end_date, v_start_date) / 12);
v_temp_date := v_start_date;
FOR each_year IN 1 .. v_cycles LOOP
IF v_end_date >= v_start_date THEN
IF v_end_date >= v_temp_date THEN
v_temp_date := add_months(v_start_date, 12);
dbms_output.put_line('循环次数:' || each_year);
dbms_output.put_line('开始时间:' ||
to_char(v_start_date, 'YYYY-MM-DD HH24:MI:SS'));
dbms_output.put_line('结束时间:' ||
to_char(v_temp_date, 'YYYY-MM-DD HH24:MI:SS'));
v_start_date := v_temp_date;
v_temp_date := add_months(v_temp_date, 12);
ELSE
dbms_output.put_line('循环次数:' || each_year);
dbms_output.put_line('开始时间:' ||
to_char(v_start_date, 'YYYY-MM-DD HH24:MI:SS'));
dbms_output.put_line('结束时间:' ||
to_char(v_end_date, 'YYYY-MM-DD HH24:MI:SS'));
END IF;
END IF;
dbms_output.put_line('');
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(dbms_utility.format_error_backtrace);
dbms_output.put_line(SQLERRM);
END;