验证ORACLE SQL的日期范围

时间:2014-08-08 22:28:47

标签: sql oracle visual-studio devexpress

所以目前我正在开发一个需要保存具有开始日期和结束日期的值的应用程序。其中一个限制是,如果我插入一个新的寄存器,我必须验证没有寄存器包含新值定义的任何月份(我知道我在这里没有正确解释,但英语不是我的母语)让我举一个视觉例子。

所以,让我们知道有一个包含这些值的表:

ID      |Start Date   | Ending date
001      05/08/2014      05/12/2014
002      03/05/2014      03/04/2014

因此,验证必须确保如果我尝试广告这样的新值:

003| 05/09/2014 |05/11/2014它不允许我进行保存数据,因为已经有一个范围包含我要添加的相同月份。

我知道如何制作c#部分。但是我正在努力学习SQL,因为这不是我最好的领域。任何帮助或指导将不胜感激。目前正在使用Oracle 9-11。

1 个答案:

答案 0 :(得分:0)

假设你的表名是: Your_table_name_here ,你可以尝试这个脚本。

Create Table Your_table_name_here
(
    Id Varchar2(25) Not Null,
    Start_date Date Not Null,
    Ending_date Date Not Null,
    Constraint Your_table_name_here_pk Primary Key(Id)
)
/

-- create a database trigger to automatically validate the date entered --

Create Or Replace Trigger Tbi_your_table_name_here
   Before Insert
   On Your_table_name_here
   Referencing New As New Old As Old
   For Each Row
Declare
   Tmpvar                        Number;
Begin
   Tmpvar := 0;

   Begin
      Select 1
        Into Tmpvar
        From Your_table_name_here
       Where (:new.Start_date Between Start_date And Ending_date
           Or  :new.Ending_date Between Start_date And Ending_date)
         And Rownum < 2;

      Raise_application_error( -20996, 'Date Range, already in database');
   Exception
      When No_data_found Then
         Null; -- is OK, no dates found in range
      When Others Then
         Raise_application_error( -20997, 'Incorrect Date : ' || Sqlerrm);
   End;
Exception
   When Others Then
      -- Consider logging the error and then re-raise
      Raise;
End Tbi_your_table_name_here;
/

Show Errors
/

基本上,您创建一个触发器来验证输入到表中的数据。

希望这会有所帮助