【问题标题】:Query to find day number of the fiscal month in oracle SQL在oracle SQL中查询会计月份的天数
【发布时间】:2018-09-14 09:03:52
【问题描述】:

查询应返回当前会计月份的天数。请检查以下查询:

SELECT *
FROM GL_PERIODS
WHERE PERIOD_SET_NAME='Fiscal Year'
AND period_year =(SELECT DISTINCT period_year
                                FROM gl_periods
                               WHERE     TRUNC (SYSDATE) BETWEEN start_date
                                                             AND end_date)

对于时间段名称:SEP-19,开始日期为 8/26/2018。因此,sysdate 的天数应该是 16。

样本数据:

period_set_name    period_name    start_date    end_date   entered_period_name
Fiscal Year         AUG-19        7/29/2018    8/25/2018    AUG
Fiscal Year         SEP-19        8/26/2018    9/22/2018    SEP
Fiscal Year         OCT-19        9/23/2018    10/27/2018   OCT

预期输出:16

【问题讨论】:

  • 您的样本数据没有period_year 列,period_nameentered_period_nameend_date 中的月份匹配,但与start_dateend_date 中的年份不匹配。
  • 如何得到16 的预期输出?今天的日期是 2018-09-14,这是您的 SEP 期间的第 20 天(26 日至 30 日是 8 月的 6 天,9 月 1 日至 14 日是 9 月的 14 天)。

标签: sql oracle fiscal dayofmonth


【解决方案1】:

我们可以对日期进行算术运算。所以今天的会计日数是:

SELECT (trunc(sysdate) - start_date) + 1 as fiscal_day_no
FROM GL_PERIODS
WHERE PERIOD_SET_NAME='Fiscal Year'
AND period_year =(SELECT DISTINCT period_year
                            FROM gl_periods
                           WHERE     TRUNC (SYSDATE) BETWEEN start_date
                                                         AND end_date)

这假设您没有特殊要求来处理,例如周末或公共假期。

【讨论】:

    【解决方案2】:

    Oracle 设置

    CREATE TABLE GL_PERIODS(
      period_set_name VARCHAR2(20),
      start_date          DATE,
      end_date            DATE,
      period_name         CHAR(6) GENERATED ALWAYS AS ( CAST( TO_CHAR( end_date, 'MON-YY' ) AS CHAR(6) ) ) VIRTUAL,
      entered_period_name CHAR(3) GENERATED ALWAYS AS ( CAST( TO_CHAR( end_date, 'MON' ) AS CHAR(3) ) ) VIRTUAL,
      period_year         NUMBER(4) GENERATED ALWAYS AS ( EXTRACT( YEAR FROM end_date ) ) VIRTUAL
    );
    
    INSERT INTO GL_PERIODS( period_set_name, start_date, end_date )
      SELECT 'Fiscal Year', DATE '2018-07-29', DATE '2018-08-25' FROM DUAL UNION ALL
      SELECT 'Fiscal Year', DATE '2018-08-26', DATE '2018-09-22' FROM DUAL UNION ALL
      SELECT 'Fiscal Year', DATE '2018-09-23', DATE '2018-10-27' FROM DUAL;
    

    查询

    SELECT TRUNC( SYSDATE - start_date + 1 ) AS fiscal_day_no
    FROM   GL_PERIODS
    WHERE  start_date <= SYSDATE
    AND    SYSDATE < END_DATE + INTERVAL '1' DAY;
    

    输出

    | FISCAL_DAY_NO |
    |---------------|
    |            20 |
    

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多