如何在Oracle中提取并显示基于Quarter的日期范围?
-
13-12-2019 - |
题
我正在构建一个汇总表作为存储过程的一部分,我有两列。第一列需要显示开始,第二列需要显示基于输入参数的日期范围的结束,该参数是指定季度的数字。我能够从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"
.(这应该确保包括季度最后一天的所有时间。)
不隶属于 StackOverflow