Sql 如何在Oracle中提取和显示基于季度的日期范围?

Sql 如何在Oracle中提取和显示基于季度的日期范围?,sql,oracle,stored-procedures,to-date,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

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

提前感谢您的回复。

我建议:

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将代表下一季度第一天的午夜,因此任何选择都应基于条件
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将代表下一季度第一天的午夜,因此任何选择都应基于条件
Tom Kyte已经给了你答案:


可以将数字年份和数字季度参数转换为日期


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

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


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

为什么有-1+1?-那只会抵消掉。您需要在哪里说明闰年?季度日期为1月1日、4月1日、7月1日和10月1日-这是您将用于特定季度的日期。@dee-inQuarter代表什么?你说这是一个表示季度的数字,大概对你来说意味着什么,但我不清楚这对我来说是什么。你的意思是你通过了一个像1这样的数字,应该被解释为今年第一季度?或者你有一个像200403这样的数字,应该解释为2004年第三季度?还是别的什么?为没有正确澄清而道歉。inQuarter是一个表示季度的1-4位数字。。这也提醒了我,还有一年,也就是YYYY,他们都需要给我他们指定的季度的第一天和最后一天。谢谢您的快速回复。@Faber。我不知道自己该如何解释这个数学公式,但+1-1给出的是2012-01-01,而-1返回的是2011-12-31,+1返回的是2012-01-02。我想这里的数字在格式层面比数学层面更有效,这就是为什么我对闰年是否有效感到好奇。@dee,你不需要+1-1或-1+1-只要把它们都去掉。你为什么有-1+1?-那只会抵消掉。您需要在哪里说明闰年?季度日期为1月1日、4月1日、7月1日和10月1日-这是您将用于特定季度的日期。@dee-inQuarter代表什么?你说这是一个表示季度的数字,大概对你来说意味着什么,但我不清楚这对我来说是什么。你的意思是你通过了一个像1这样的数字,应该被解释为今年第一季度?或者你有一个像200403这样的数字,应该解释为2004年第三季度?还是别的什么?为没有正确澄清而道歉。inQuarter是一个表示季度的1-4位数字。。这也提醒了我,还有一年,也就是YYYY,他们都需要给我他们指定的季度的第一天和最后一天。谢谢您的快速回复。@Faber。我不知道自己该如何解释这个数学公式,但+1-1给出的是2012-01-01,而-1返回的是2011-12-31,+1返回的是2012-01-02。我想这里的数字在格式层面比数学层面更有效,这就是为什么我对闰年是否有效感到好奇的原因。@dee,你不需要+1-1或-1+1-只要把这两个都去掉就行了。谢谢Mark,这对我来说肯定能解决我的闰年问题。知道我如何从两个给定参数中提取日期吗?谢谢Mark,这绝对是为了解决我的闰年问题。知道如何从两个给定参数中提取日期吗?这三个答案提供了所有的工作。谢谢大家的时间,三位
答案提供了所有的工作。谢谢大家的时间。谢谢,A.B.汤姆。。。。呃,A.B。。。这完全正确。我也是从AskTom开始的。。。不知道我怎么会错过这个。谢谢,A.B.呃,汤姆。。。。呃,A.B。。。这完全正确。我也是从AskTom开始的。。。不知道我怎么会错过这个。
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