1

我正在构建一个汇总表作为存储过程的一部分,并且我有两列。第一列需要显示开始,第二列需要显示基于输入参数的日期范围的结束,该输入参数是指定季度的数字。我能够从 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 但我认为我需要先将它重新格式化为日期?

提前感谢您的任何回复。

4

3 回答 3

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)
于 2012-03-13T14:45:33.710 回答
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"。(这应确保包括季度最后一天的所有时间。)

于 2012-03-13T14:28:14.660 回答
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。

于 2012-03-13T14:46:06.443 回答