如何在plsql中获取去年的开始和结束日期

时间:2014-11-11 21:35:41

标签: plsql oracle-apex

我有一个带有三个参数的plsql函数count_order_cust。但p_startp_end是可选的。如果我用三个参数调用函数,那么函数执行得很好,但如果我用一个参数p_id调用函数,那么它必须计算去年的订单(即2013年1月1日 - 2013年12月31日)这是我的问题。我怎样才能做到这一点?

这是函数count_order_cust

CREATE OR REPLACE FUNCTION count_order_cust(p_id f_customers.id%TYPE, p_sd f_orders.order_date%TYPE DEFAULT NULL, p_ed f_orders.order_date%TYPE DEFAULT NULL)
RETURN NUMBER IS v_count_orders NUMBER(3) := 0;
BEGIN
SELECT COUNT(cust_id) INTO v_count_orders
FROM f_orders
WHERE cust_id = p_id AND f_orders.order_date BETWEEN p_sd AND p_ed;
RETURN v_count_orders;
EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL;
END count_order_cust;

有了这个选择,我在去年得到了日期,但我需要在p_sd =' 01 / Jan / 2013'并且在p_ed =' 31 / Dec / 2013'。

select add_months(sysdate,-12) from dual;

1 个答案:

答案 0 :(得分:1)

以下代码显示了如何派生所需日期,然后将代码捆绑到可用作过程默认参数的函数中:

declare 

   function getFirstDayOfLastYear return date is   
   begin
      return trunc(add_months(sysdate,-12),'YEAR');   
   end;

   function getLastDayOfLastYear return date is   
   begin
      return trunc(sysdate,'YEAR') - 1;   
   end;

   procedure myProc(
       p_start date default getFirstDayOfLastYear, 
       p_end date default getLastDayOfLastYear
   ) is 
   begin
      dbms_output.put_line(p_start);
      dbms_output.put_line(p_end);
   end;


begin

  myProc;

end;