【问题标题】:Problem with getting the quarter from a date in Oracle从 Oracle 中的日期获取季度的问题
【发布时间】:2019-03-24 04:48:34
【问题描述】:

我编写了一个查询,通过使用 sysdate 获取当前年份和上一年季度的开始日期。

例如。今天是今年第一季度,所以我只想得到去年第一季度和今年的开始日期。 如果我在 12 月(即第 4 季度),我想获得 8 个季度的开始日期(去年 4 个,今年 4 个。)

select b.dt,
       to_number(to_char(SYSDATE, 'Q')),
       to_number(to_char(b.dt, 'Q'))
  from dual a,
       (select add_months(trunc(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -12),
                                'yyyy'),
                          (rownum - 1) * 3) dt
          from all_objects
         where rownum <= 8
           and add_months(trunc(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -12),
                                'yyyy'),
                          (rownum - 1) * 3) <= SYSDATE
           and to_number(to_char(SYSDATE, 'Q')) >=
               to_number(to_char(add_months(trunc(ADD_MONTHS(TRUNC(SYSDATE,
                                                                   'MM'),
                                                             -12),
                                                  'yyyy'),
                                            (rownum - 1) * 3),
                                 'Q'))) b

此查询仅返回去年第一季度的开始日期。我也希望得到今年第一季度的开始日期。

【问题讨论】:

    标签: sql oracle date


    【解决方案1】:

    这是一种选择;查看代码中的 cmets。

    SQL> alter session set nls_date_format = 'dd.mm.yyyy';
    
    Session altered.
    
    SQL> with
      2  -- this mimics SYSDATE
      3  today (datum) as
      4    (select date '&date_literal' from dual),
      5  -- which quarter does DATUM belong to? Find 1st day in "this" and "previous" year
      6  quart as
      7    (select trunc(datum, 'yyyy') this,
      8            trunc(add_months(datum, -12), 'yyyy') previous,
      9            to_char(datum, 'q') quart from today)
     10  -- the fina result
     11  select add_months(this, (level - 1) * 3) result
     12  from quart
     13  connect by level <= quart
     14  union all
     15  select add_months(previous, (level - 1) * 3) result
     16  from quart
     17  connect by level <= quart;
    Enter value for date_literal: 2019-03-24
    
    RESULT
    ----------
    01.01.2019
    01.01.2018
    
    SQL> /
    Enter value for date_literal: 2019-08-13
    
    RESULT
    ----------
    01.01.2019
    01.04.2019
    01.07.2019
    01.01.2018
    01.04.2018
    01.07.2018
    
    6 rows selected.
    
    SQL>
    

    【讨论】:

    • 感谢您的建议 :) 但是您知道为什么我的查询失败了吗?至于为什么即使季度相同,它也不返回当前年份?
    • 不客气。根据您的查询:如果您将 SYSDATE 更改为更高的日期(例如,在今年的第三季度)并运行 only b 内联视图(将 ROWNUM 包含到选择值中),请删除所有WHERE 条件并运行查询。您会看到 ROWNUM = 8。然后您通过添加一些条件来限制它,但是 - 结果 - 您将获得 连续 个季度日期。例如,对于第 2 季度,您将获得 2018 年的前两个日期。对于第 4 季度日期,您获得所需的结果。我会说你应该修复b(如果你愿意的话),或者 - 使用我的查询。
    • 谢谢。我会采用你的方法:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    相关资源
    最近更新 更多