【问题标题】:Find First and Last Day of the last Quarter in ORACLE在 ORACLE 中查找上一季度的第一天和最后一天
【发布时间】:2020-06-05 21:00:32
【问题描述】:

我有一个表格查询:

select *
from X
where <some_date is in the last quarter>

我真的很难获得上一季度的正确日期。因此,假设当前日期是 7 月 1 日,即在第三季度,我希望将 4 月 1 日 设为 FIRST,6 月 30 日 作为上一季度(即第二季度)的最后一天。

在 Google 上搜索了一下,找到了很多解决方案,但每一个都涵盖了 SQL Server,而且我们的 ORACLE 数据库(Oracle 10g 和 11g)上没有可用的时髦方法。

哦,是的,而且我需要能够将整个事情放到一个查询中,因为这是一些工具对我施加的限制,它将进一步处理这个查询...:/

【问题讨论】:

    标签: sql date


    【解决方案1】:

    这个比较简单,但可能仍然不是最简单的方法:

    SELECT
      ADD_MONTHS(TRUNC(SYSDATE, 'Q'), -3) AS First,
      TRUNC(SYSDATE, 'Q') - 1 AS Last
    FROM DUAL
    

    也许您也可以像这样使用子选择来排除一些重复的代码:

    SELECT
      ADD_MONTHS(D, -3) AS First,
      D - 1 AS Last
    FROM (SELECT TRUNC(SYSDATE, 'Q') AS D FROM DUAL)
    

    【讨论】:

      【解决方案2】:
      SELECT
        TRUNC(SYSDATE, 'Q')AS FIRST_DAY,
        last_day(add_months(TRUNC(SYSDATE, 'Q'),2)) as LAST_DAY                
      FROM DUAL;
      

      【讨论】:

        【解决方案3】:
        SELECT MIN (t), MAX (LAST_DAY (t))
          FROM (    SELECT ADD_MONTHS (TRUNC (SYSDATE, 'yyyy'), LEVEL - 1) t,
                           TO_CHAR (ADD_MONTHS (TRUNC (SYSDATE, 'yyyy'), LEVEL - 1), 'Q')
                              r
                      FROM DUAL
                CONNECT BY LEVEL <= 12) a
         WHERE a.r = 4;
        

        【讨论】:

          【解决方案4】:

          这是一种方法,它省去了计算第一个和最后一个日期并将结果放入主查询的 where 子句的麻烦:

          select
              *,
              round(to_number(to_char(some_date, 'mm')) / 4) as quarter
          from x
          where round(to_number(to_char(some_date, 'mm')) / 4) = round(to_number(to_char(sysdate, 'mm')) / 4)
          

          【讨论】:

            【解决方案5】:

            典型的,只要我寻求帮助,我就会找到一些博客,让我知道如何继续。

            设法将一些声明拼凑在一起,但它绝对是丑陋的。 :)

            select
                TRUNC(ADD_MONTHS(sysdate, -3),'Q') as first,
                LAST_DAY(TRUNC(ADD_MONTHS(sysdate, -3),'Q')+ 85) as last
            from dual;
            

            这似乎可以解决问题,但是如果有人知道更好的解决方案,请告诉我! (to_date('27-JAN-11') 以日期为例...)

            编辑:修复了一个错误 - 将 3 个月添加到季度的第一天并不总是在同一季度结束。现在它更丑了——该死的公历!

            【讨论】:

              【解决方案6】:
              SELECT DATE_CURRENT
                   , TRUNC (ADD_MONTHS (DATE_CURRENT, -6), 'Q')                  AS FIRST
                   , LAST_DAY (TRUNC (ADD_MONTHS (DATE_CURRENT, -6), 'Q') + 85)  AS LAST
                   , LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-1))                  AS PREVIOUS_QUARTER_END
                   , ADD_MONTHS(LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-1)),-3)+1 AS PREVIOUS_QUARTER_START
              FROM
                     (
                           SELECT TO_DATE ('31.07.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL
                     UNION SELECT TO_DATE ('30.06.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL
                     UNION SELECT TO_DATE ('30.04.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL
                     UNION SELECT TO_DATE ('31.03.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL
                     )
              order by DATUM;
              

              【讨论】:

                【解决方案7】:
                    SELECT DATE_CURRENT
                         , TRUNC (DATE_CURRENT, 'Q')                  AS Q1F
                         , LAST_DAY (ADD_MONTHS(TRUNC (DATE_CURRENT, 'Q'),2))  AS Q1L
                         , LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-1))                  AS Q2F
                         , ADD_MONTHS(LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-1)),-3)+1 AS Q2L
                              , LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-4))                  AS Q3F
                         , ADD_MONTHS(LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-4)),-3)+1 AS Q3L
                                   , LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-7))                  AS Q4F
                         , ADD_MONTHS(LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-7)),-3)+1 AS Q4L
                                        , LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-10))                  AS Q5F
                         , ADD_MONTHS(LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-10)),-3)+1 AS Q5L
                                        , LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-13))                  AS Q6F
                         , ADD_MONTHS(LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-13)),-3)+1 AS Q6L
                                           , LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-16))                  AS Q7F
                         , ADD_MONTHS(LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-16)),-3)+1 AS Q7L
                                     , LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-19))                  AS Q8F
                         , ADD_MONTHS(LAST_DAY (ADD_MONTHS(trunc(DATE_CURRENT,'Q'),-19)),-3)+1 AS Q8L
                    FROM
                           (
                                 SELECT TO_DATE ('05.03.2017', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL
                           UNION SELECT TO_DATE ('30.06.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL
                           UNION SELECT TO_DATE ('30.04.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL
                           UNION SELECT TO_DATE ('31.03.2014', 'DD.MM.YYYY') AS DATE_CURRENT FROM DUAL
                           )
                

                【讨论】:

                • 请编辑您的帖子,以便格式化代码。谢谢。
                【解决方案8】:

                我知道这个话题已经过时并且已经结束,但这是我正确解决问题的方式。

                SELECT TRUNC(to_date('05.06.2020', 'dd.mm.yyyy'), 'Q') f_date,
                      LAST_DAY(ADD_MONTHS(TRUNC(TO_DATE('05.06.2020', 'dd.mm.yyyy'), 'Q'),2) ) l_date
                 FROM dual;
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-09-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-09-30
                  相关资源
                  最近更新 更多