如何根据Oracle中的Quarter提取和显示日期范围?

时间:2012-03-13 13:46:26

标签: sql oracle stored-procedures to-date

我正在构建一个汇总表作为存储过程的一部分,我有两列。第一列需要显示开始,第二列需要显示日期范围的结束,该日期范围基于输入参数,该输入参数是指定季度的数字。我能够从AskTom中提取以下内容,但我有一些问题。

Open C1 FOR
SELECT  ( SELECT TRUNC (SYSDATE, 'Q')-1+1 AS 'StartOf' FROM DUAL ),
SELECT  ( SELECT TRUNC(ADD_MONTHS (SYSDATE, +3), 'Q')-2 AS 'EndOf' FROM DUAL )
FROM DUAL; 

问题1.这里的数学会考虑LeapYears ......我认为不会,但我不知道如何处理。

问题2.如何将输入参数'inQuarter'添加为特定季度?我试过把它放在sysdate的位置但我需要先将它重新格式化为日期吗?

提前感谢您的回复。

3 个答案:

答案 0 :(得分:3)

Tom Kyte给了你答案: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:250288900346075009

Open C1 FOR 
select add_months( dt, (inQuarter-1)*3 ),
       last_day(add_months( dt, (inQuarter-1)*3+2 ) )
from (
  select to_date( inYear || '0101', 'yyyymmdd' ) dt
  from dual)

答案 1 :(得分:1)

我建议:

Open C1 FOR
SELECT TRUNC (d_inQuarter, 'Q') AS "StartOf",
       TRUNC(ADD_MONTHS (d_inQuarter, +3), 'Q') AS "EndOf"
FROM (SELECT add_months(to_date(to_char(i_yr)||'-01-01','YYYY-MM-DD'), (i_q-1)*3)
      AS d_inQuarter FROM DUAL); 

- 分别用整数参数i_yr和i_q表示年份和季度。

请注意,EndOf将代表下一季度第一天的午夜,因此任何选择都应基于条件< "EndOf",而不是<= "EndOf"。 (这应该确保包括该季度最后一天的所有时间。)

答案 2 :(得分:1)

您可以将数字年份和数字季度参数转换为DATE

SELECT add_months( trunc( to_date( to_char( <<numeric year>> ),
                                   'YYYY' ),
                          'YYYY' ),
                   3 * <<numeric quarter>> ) first_of_quarter,
       add_months( trunc( to_date( to_char( <<numeric year>> ),
                                   'YYYY' ),
                          'YYYY' ),
                   4 * <<numeric quarter>> ) - 1 last_of_quarter,
  FROM dual

两个日期的时间部分将是该季度最后一天的午夜(即下一季度开始前24小时)。如果您希望该范围包含该季度中所有可能的日期,您可能希望该季度的最后一天是该季度的最后一天23:59:59。