我正在尝试将选择变成Toad / Oracle中的功能

时间:2019-01-07 07:32:13

标签: sql oracle plsql stored-functions

我正在尝试将此选择变为功能。 用户将使用自己想要的日期而不是sysdate的日期。 (对不起,英语不好。)

SELECT  trunc(sysdate),
        trunc(sysdate) - 1,
        trunc(sysdate) - 2,
        trunc(sysdate) - 3,
        trunc(last_day(sysdate)-1, 'mm'),       
        add_months(trunc(sysdate, 'MM'), -1) first_day_of_last_month,
        add_months(trunc(sysdate, 'MM'), -2) first_day_of_last_month,
        add_months(trunc(sysdate, 'MM'), -3) first_day_of_last_month,
        add_months(trunc(sysdate, 'Q'), -6) first_day_of_last_quarter,
        add_months(trunc(sysdate, 'Q'), -9) first_day_of_last_quarter,
        add_months(trunc(sysdate, 'Q'), -12) first_day_of_last_quarter,
        add_months(trunc(sysdate, 'Q'), -15) first_day_of_last_quarter,
        add_months(trunc(sysdate, 'Q'), -18) first_day_of_last_quarter
FROM dual;

结果应该在1行中看起来像这样

1/7/2019    1/6/2019    1/5/2019    1/4/2019    1/1/2019    12/1/2018   11/1/2018   10/1/2018   7/1/2018    4/1/2018    1/1/2018    10/1/2017   7/1/2017

1 个答案:

答案 0 :(得分:0)

您可以构建一个返回引用光标的函数。

CREATE FUNCTION get_dates(pdt_ref_date IN DATE)
RETURN SYS_REFCURSOR IS
    pcr_result SYS_REFCURSOR;
BEGIN
    OPEN pcr_result FOR
    SELECT  
        trunc(pdt_ref_date),
        trunc(pdt_ref_date) - 1,
        trunc(pdt_ref_date) - 2,
        trunc(pdt_ref_date) - 3,
        trunc(last_day(pdt_ref_date)-1, 'mm'),       
        add_months(trunc(pdt_ref_date, 'MM'), -1) first_day_of_last_month,
        add_months(trunc(pdt_ref_date, 'MM'), -2) first_day_of_last_month,
        add_months(trunc(pdt_ref_date, 'MM'), -3) first_day_of_last_month,
        add_months(trunc(pdt_ref_date, 'Q'), -6) first_day_of_last_quarter,
        add_months(trunc(pdt_ref_date, 'Q'), -9) first_day_of_last_quarter,
        add_months(trunc(pdt_ref_date, 'Q'), -12) first_day_of_last_quarter,
        add_months(trunc(pdt_ref_date, 'Q'), -15) first_day_of_last_quarter,
        add_months(trunc(pdt_ref_date, 'Q'), -18) first_day_of_last_quarter
    FROM dual;

    RETURN pcr_result;
END;

可以通过以下方式使用:

SELECT get_dates(SYSDATE)
FROM DUAL;

请注意:

  • 我不知道此功能的用途,所以我一般称其为 get_dates
  • 您可能需要在包中定义此功能, 特别是如果您有几个相关的功能/过程