【问题标题】:ORACLE find the first day and last day of a given quarterORACLE 查找给定季度的第一天和最后一天
【发布时间】:2019-04-01 18:59:24
【问题描述】:

有没有办法可以找到给定季度的第一天和最后一天?

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

示例:

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

例如:

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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    trunc( sysdate, 'Q' )
    

    会给你当前季度的第一天。

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

    会给你y 年季度的第一天q。使用不同年份和季度值调用此函数的示例

    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 天。

    【讨论】:

    • 我不明白这个trunc( add_months(date '0001-01-01', (y-1)*12 + (q-1)*3, 'Q' ) 不适合我
    • @Giorgos - 我错过了一个括号。现已修复。
    【解决方案2】:

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

    当年的第一天:

    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
    

    【讨论】:

    • dateadddatediff 是 SQL Server 函数,而不是 Oracle 函数。
    • 已编辑。感谢您的通知。
    • 不必要的复杂,oracle 支持季度的Q 日期格式。
    【解决方案3】:

    试试这个

    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
    

    【讨论】:

    • Plirkee 如果我的日期是 2016 年 2 月 2 日和第 3 季度,它是如何工作的?
    • 您的意思是您的季度不是从月初开始的?你没有在你的问题中提到这一点......但是我猜它仍然可以工作。你觉得这个解决方案有什么特别的问题吗?
    • 检查我给出的查询。
    • @Giorgos 结果是2/8/2016,1/11/20162/2/2016 和四分之一3
    • @Giorgos 您是如何获得结果的?
    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多