pl/SQL for 循环

pl/SQL for loop

DECLARE 
   a number(2);
  cnt number;
BEGIN 
    
   FOR a in 01 .. 12 LOOP 
     
     SELECT count(*) 
     INTO cnt
     FROM ECMS_ONLINE_TRANSACTION eoa
     WHERE eoa.CREATETIME BETWEEN TO_DATE('2021-01-01 01:00:00','YYYY-MM-DD HH24:MI:SS')
                              AND TO_DATE('2021-01-01 01:59:59','YYYY-MM-DD HH24:MI:SS'); 
 
     dbms_output.put_line(' month: ' || a || ' time stamp 01:00:00- 01:59:59  number of transaction :' || cnt ); 
   END LOOP; 
END;

我在根据我在函数之间使用的子句中的循环更改月份时遇到问题 todate 函数的月份必须根据循环更改如果 a 变为 1 那么 where 子句中的月份有如果a变为2则按1更改月份已更改为2

敌人的例子

如果一个=1

WHERE eoa.CREATETIME BETWEEN TO_DATE('2021-01-01 01:00:00','YYYY-MM-DD HH24:MI:SS')
                         AND TO_DATE('2021-01-01 01:59:59','YYYY-MM-DD HH24:MI:SS'); 

如果一个=2

WHERE eoa.CREATETIME BETWEEN TO_DATE('2021-02-01 01:00:00','YYYY-MM-DD HH24:MI:SS')
                         AND TO_DATE('2021-02-01 01:59:59','YYYY-MM-DD HH24:MI:SS'); 

我使用了时间戳变量

使用这个条件:

WHERE eoa.CREATETIME BETWEEN TO_DATE('2021-' || lpad(a, 2, '0') || '-01 01:00:00','YYYY-MM-DD HH24:MI:SS')
                         AND TO_DATE('2021-' || lpad(a, 2, '0') || '-01 01:59:59','YYYY-MM-DD HH24:MI:SS'); 

写这个可能更简单(但它不会在 CREATETIME 上使用索引,如果你有的话):

WHERE to_char(eoa.CREATETIME, 'MM') = a
  AND to_char(eoa.CREATETIME, 'HH24' = '01'