0

我有一个名为 as 的表,其中包含和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 July至之间30th 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');
4

2 回答 2

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 排序时,日期范围基于之前和之后的记录。不过,也许真正应该按活动日期排序。使用 LAG 和 LEAD 也将允许 activity_ids 中的间隙。

于 2012-07-30T14:00:20.763 回答
0

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

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

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

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

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

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

于 2012-07-30T13:44:49.017 回答