有没有办法找到某一季度的第一天和最后一天?
如果我选择第一季度,那么我应该能够得到 第一季度的第一天和最后一天
示例:
quarter = 1
,年份为2016
。预期结果为01/01/2016
- 31/03/2007
(DD/MM/YYYY
格式)。
例如:
select(quarterdatestart, quarterdatedate) where year = 2016 and quarter = 1;
答案 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