Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在ORACLE中查找上一季度的第一天和最后一天_Sql_Date - Fatal编程技术网

Sql 在ORACLE中查找上一季度的第一天和最后一天

Sql 在ORACLE中查找上一季度的第一天和最后一天,sql,date,Sql,Date,我对表格有一个疑问: select * from X where <some_date is in the last quarter> 我真的很难找到上个季度的正确日期。所以,假设当前日期是7月1日,即第三季度,我希望将4月1日作为第一季度,将6月30日作为最后一季度(即第二季度)的最后一天 谷歌搜索了一下,发现了大量的解决方案,但每一个都涵盖了SQL Server和我们的ORACLE数据库ORACLE 10g和11g上没有的时髦方法 哦,是的,而且我还需要能够将整个内容放到一个查

我对表格有一个疑问:

select *
from X
where <some_date is in the last quarter>
我真的很难找到上个季度的正确日期。所以,假设当前日期是7月1日,即第三季度,我希望将4月1日作为第一季度,将6月30日作为最后一季度(即第二季度)的最后一天

谷歌搜索了一下,发现了大量的解决方案,但每一个都涵盖了SQL Server和我们的ORACLE数据库ORACLE 10g和11g上没有的时髦方法


哦,是的,而且我还需要能够将整个内容放到一个查询中,因为这是某个工具对我施加的限制,该工具将进一步处理此查询…:/

典型的情况是,我一请求帮助,就会找到一些博客,让我知道如何继续

设法拼凑出一些说法,但绝对是丑陋的

select
    TRUNC(ADD_MONTHS(sysdate, -3),'Q') as first,
    LAST_DAY(TRUNC(ADD_MONTHS(sysdate, -3),'Q')+ 85) as last
from dual;
这似乎很管用,但是如果有人知道更好的解决方案,请告诉我!截止日期“2011年1月27日”是其中的一个示例日期


编辑:修正了一个错误-在一个季度的第一天增加3个月并不总是在同一个季度结束。现在更难看了,该死的公历

这是一种方法,它省去了计算第一个和最后一个日期的麻烦,并将结果放入主查询的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)

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

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)

我知道这个话题很古老,也很封闭,但这就是我正确解决这个问题的方式

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;

请编辑您的帖子,以便对代码进行格式化。非常感谢。
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;
SELECT
  TRUNC(SYSDATE, 'Q')AS FIRST_DAY,
  last_day(add_months(TRUNC(SYSDATE, 'Q'),2)) as LAST_DAY                
FROM DUAL;
    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
           )
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;