Oracle SQL Query用于检查活动的有效日期范围?

时间:2012-07-30 11:39:45

标签: sql oracle

我有一个名为Activity的表格,其中包含activity_idactivity_date等列。

考虑活动表中的数据,如下所示,

activity_id    activity_date    
1              1st June
2              1st July
3              1st August
4              1st September
5              1st October

现在我想更改活动3的日期,但我无法将日期更改为小于1st July或大于1st September,因为在这些日期已经有一些其他活动。

活动3的唯一有效日期介于2nd July30th August之间。

同样,对于活动1,有效的新日期可以是1st July之前的任何日期。

同样,对于活动5,有效的新日期范围从2nd September到将来的任何日期作为其最后一项活动。

如果新日期不在范围内,我需要在前端向用户提供验证消息。 查询的输入将是活动ID和新活动日期。

以下是DDL脚本

    CREATE TABLE "HEADCOUNT"."ACTIVITY" 
(   "ACTIVITY_ID" NUMBER(*,0) NOT NULL, 
    "ACTIVITY_DATE" DATE
); 

Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (1,'01-06-2012');
Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (2,'01-07-2012');
Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (3,'01-08-2012');
Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (4,'01-09-2012');
Insert into "HEADCOUNT"."ACTIVITY" (ACTIVITY_ID,ACTIVITY_DATE) values (5,'01-10-2012');

2 个答案:

答案 0 :(得分:0)

使用下面的查询查找日期限制(将@param_id替换为更改活动ID):

SELECT activity_id, activity_date
FROM   activity
WHERE  activity_id = @param_id-1
   OR  activity_id = @param_id+1

此查询最多返回两个结果,但对于第一个和最后一个活动,只返回一个。因此,您应该在前端阅读结果并决定该做什么:

  1. 指定开始限制:标识为@param_id-1的结果指定开始日期限制。如果没有此ID的结果,则这是第一个活动,对开始日期没有限制。

  2. 指定结束限制: ID为@param_id+1的结果指定结束日期限制。如果没有带有此ID的结果,则这是最后一项活动,并且没有结束日期的限制。

  3. 执行或警告:如果新日期在范围内,请执行更改。否则警告用户。

答案 1 :(得分:0)

这将找到每行的日期范围:

SELECT activity_id, activity_date
      ,NVL( LAG(activity_date) OVER(ORDER BY activity_id) 
           ,TO_DATE('1900-01-01', 'YYYY-MM-DD')
          ) AS previous_date
      ,NVL( LEAD(activity_date) OVER(ORDER BY activity_id)
           ,TO_DATE('2100-01-01', 'YYYY-MM-DD')
          ) AS next_date
  FROM activity
  ORDER BY activity_id

结果:

                       ACTIVITY_ID ACTIVITY_DATE PREVIOUS_DATE NEXT_DATE
---------------------------------- ------------- ------------- ---------
                                 1 01-JUN-12     01-JAN-00     01-JUL-12 
                                 2 01-JUL-12     01-JUN-12     01-AUG-12 
                                 3 01-AUG-12     01-JUL-12     01-SEP-12 
                                 4 01-SEP-12     01-AUG-12     01-OCT-12 
                                 5 01-OCT-12     01-SEP-12     01-JAN-00

验证将针对给定的id:

“输入日期”> previous_date AND“输入日期”< NEXT_DATE

日期范围基于activity_id排序时的先前和后续记录。但是,顺序应该是activity_date。使用LAG和LEAD也可以在activity_ids中留出空白。