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

如何在plsql中获取去年的开始日期和结束日期,plsql,oracle-apex,Plsql,Oracle Apex,我有一个带有三个参数的plsql函数count\u order\u cust。但是p_开始和p_结束是可选的。如果我用三个参数调用函数,那么函数执行得很好,但是如果我用一个参数调用函数p_id,那么它必须统计去年(即2013年1月1日-2013年12月31日)的订单,这就是我的问题。我该怎么做 下面是函数计数\u订单\u客户: CREATE OR REPLACE FUNCTION count_order_cust(p_id f_customers.id%TYPE, p_sd f_orders.o

我有一个带有三个参数的plsql函数
count\u order\u cust
。但是
p_开始
p_结束
是可选的。如果我用三个参数调用函数,那么函数执行得很好,但是如果我用一个参数调用函数
p_id
,那么它必须统计去年(即2013年1月1日-2013年12月31日)的订单,这就是我的问题。我该怎么做

下面是函数
计数\u订单\u客户

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;

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

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;