我有一个名为Activity
的表格,其中包含activity_id
和activity_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');
答案 0 :(得分:0)
使用下面的查询查找日期限制(将@param_id
替换为更改活动ID):
SELECT activity_id, activity_date
FROM activity
WHERE activity_id = @param_id-1
OR activity_id = @param_id+1
此查询最多返回两个结果,但对于第一个和最后一个活动,只返回一个。因此,您应该在前端阅读结果并决定该做什么:
指定开始限制:标识为@param_id-1
的结果指定开始日期限制。如果没有此ID的结果,则这是第一个活动,对开始日期没有限制。
指定结束限制: ID为@param_id+1
的结果指定结束日期限制。如果没有带有此ID的结果,则这是最后一项活动,并且没有结束日期的限制。
执行或警告:如果新日期在范围内,请执行更改。否则警告用户。
答案 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中留出空白。