【问题标题】:Oracle function for smallest possible date最小可能日期的 Oracle 函数
【发布时间】:2018-11-14 22:31:20
【问题描述】:

考虑以下两个函数,它们返回客户租用的电影数量。第二个重载第一个,并且有两个参数来指定应该租用电影的范围。

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;

【问题讨论】:

  • 甲骨文中有一个绝对“最早”的日期(公元前,几千年前)。但是对于这个应用程序,你为什么需要它?你肯定在 1300 年没有任何租金,是吗?所以使用 1300 年 1 月 1 日作为默认的 begin_date。
  • 顺便说一句,你不需要两个函数。您可以通过为第二个函数的第二个和第三个参数提供默认值来使它们成为可选参数。然后,如果仅使用一个参数调用该函数,则将调用相同的(second)函数,默认为 begin_date 和 end_date。
  • 我会使用 NULL 而不是“最小可能日期”
  • 你只需要一个函数,例如:FUNCTION GetFilmCount(customer_id_in IN CUSTOMER.CUSTOMER_ID%TYPE, begin_date_in IN DATE DEFAULT NULL, end_date_in IN DATE DEFAULT SYSDATE) RETURN INTEGER;

标签: oracle date plsql


【解决方案1】:

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;

【讨论】:

    【解决方案2】:

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

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

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 1970-01-01
      • 2015-08-12
      • 2010-10-15
      • 2012-04-05
      • 2023-04-03
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多