Oracle函数可将日期最小化

时间:2018-11-14 22:31:20

标签: oracle date plsql

请考虑以下两个功能,这些功能可以返回客户租借的电影数量。第二个重载了第一个,并且还有两个参数来指定影片的租借范围。

FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE)
RETURN INTEGER;    

FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE, begin_date_in IN DATE, end_date_in IN DATE)
RETURN INTEGER;

为减少代码重复,我想从第一个调用第二个函数。对于 end_date_in ,我可以传递 SYSDATE ,但是有 Oracle 函数可以传递 begin_date_in 的最小日期( <>以下代码中的<>)而不查询 CUSTOMER 表?

FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE)
RETURN INTEGER IS
BEGIN
  RETURN GetFilmCount(customer_id_in, <> ,SYSDATE);
END;

2 个答案:

答案 0 :(得分:2)

使用NULL表示“未定义”值,而不是一些幻数:

FUNCTION GetFilmCount(
  customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE
)
RETURN INTEGER IS
BEGIN
  RETURN GetFilmCount(customer_id_in, NULL ,SYSDATE);
END;

FUNCTION GetFilmCount(
  customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE,
  begin_date_in  IN DATE,
  end_date_in    IN DATE
)
RETURN INTEGER IS
  p_count NUMBER;
BEGIN
  SELECT COUNT(*)
  INTO   p_count
  FROM   your_table
  WHERE  customer_id = customer_id_in
  AND    ( begin_date_in IS NULL OR begin_date_in    <= your_date_column )
  AND    ( end_date_in   IS NULL OR your_date_column <= end_date_in );

  RETURN p_count;
END;

答案 1 :(得分:1)

Oracle中DATE变量的最小值是公元前4712年1月1日,因此以下内容将为您提供最大范围,包括SYSDATE:

RETURN GetFilmCount(customer_id_in, TO_DATE('01-Jan-4712 BC', 'DD-MON-YYYY BC'), SYSDATE);

好运。