我正在构建一个汇总表作为存储过程的一部分,我有两列。第一列需要显示开始,第二列需要显示基于输入参数的日期范围的结束,该参数是指定季度的数字。我能够从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。这里的数学会占很多年吗?..我不认为会,但我不确定如何处理。

问题2。如何添加输入参数'inQuarter'作为特定的季度?我试过把它放在sysdate的地方,但我需要首先将其重新格式化为日期我想?

提前感谢您的任何回复。

有帮助吗?

解决方案

汤姆kyte有givven你的答案: http://问问.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)
.

其他提示

您可以将数字年份和数字季度参数转换为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是23:59:59。

我建议:

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".(这应该确保包括季度最后一天的所有时间。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top