plsql 按年取数、按月取数详解

文章目录

1 概述

  • 使用场景: 当一段 sql 查询时间太长时,可以 分时间段 进行查询,如:按年查询、按月查询等

2 源码

-- *****************************************
-- 功能:按年取数(或 按月取数)
-- 说明:若想 "按月取数": add_months(v_start_date, 1)
-- *****************************************
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
      -- 当累加时间 不超过 '结束时间' 时,'统计结束时间' 为 v_temp_date
      IF v_end_date >= v_temp_date THEN
        -- 临时统计时间
        v_temp_date := add_months(v_start_date, 12); -- 按年取数 12 个月(1 年)
      
        -- 时间段
        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
        -- 当 时间累加超过 '结束时间' 时,'统计结束时间' 为 v_end_date
        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;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值