ORACLE找到特定季度的第一天和最后一天

时间:2016-09-02 08:41:49

标签: sql oracle

有没有办法找到某一季度的第一天和最后一天?

如果我选择第一季度,那么我应该能够得到 第一季度的第一天和最后一天

示例:

quarter = 1,年份为2016。预期结果为01/01/2016 - 31/03/2007DD/MM/YYYY格式)。

例如:

select(quarterdatestart, quarterdatedate) where year = 2016 and quarter = 1;

3 个答案:

答案 0 :(得分:4)

trunc( sysdate, 'Q' )

将为您提供本季度的第一天。

trunc( add_months(date '0001-01-01', (y-1)*12 + (q-1)*3), 'Q' ) 

将在第q年为您提供季度y的第一天。使用不同的年和季度值调用此示例

with x as (
  select 2016 y, 1 q from dual union all
  select 2016, 2 from dual union all
  select 2015, 4 from dual
)
select trunc( add_months(date '0001-01-01', (y-1)*12 + (q-1)*3), 'Q' ) 
  from x

要在本季度的最后一天午夜,只需添加三个月并减去一天

<<first day of quarter>> + interval '3' month - interval '1' day

add_months(<<first day of quarter>>, 3) - 1

我通常发现间隔语法更具表现力,但旧语法更紧凑。

如果您想要季度中的最后一个日期(季度最后一天的23:59:59),则只需减去1秒而不是1天。

答案 1 :(得分:1)

是的,您可以执行以下操作:

今年的第一天:

SELECT TRUNC (SYSDATE , ‘YEAR’) FROM DUAL;

今年的最后一天:

SELECT ADD_MONTHS(TRUNC (SYSDATE, ’YEAR’), 12) - 1 FROM DUAL;

顺便说一句,您可以使用以下命令查找所需的输出:

with q(qtr) as( 
      select add_months( DATE '2016-01-01',
      (level - 1) * 3 ) from dual connect by level <= 4 )
       select qtr as first_day,
      last_day(add_months(qtr, 2)) as last_day 
from q

答案 2 :(得分:0)

试试这个

SELECT  ADD_MONTHS( to_date('01/01/2017','dd/mm/rrrr') ,3*(:quarter-1)) first, ADD_MONTHS( to_date('01/01/2017','dd/mm/rrrr') ,3*:quarter)-1 last   FROM dual