如果条目的日期范围已存在,则验证插入和限制插入的记录

时间:2016-03-16 10:08:10

标签: sql oracle oracle-sqldeveloper

我的表格结构如下

  

从Table_name中选择*

Name     Start_Date      End_Date
XXY      14-FEB-2016     3-MAR-2016
XXD      21-JAN-2016     1-FEB-2016
XXY      18-FEB-2016     3-MAR-2016
XXD      21-JAN-2016     1-FEB-2016
XXD      22-JAN-2016     1-FEB-2016

数据存在同一名称具有重叠日期范围的问题。

  

例如,XXY

XXY      18-FEB-2016     3-MAR-2016

无效,因为start_date介于现有记录的日期范围

之间
XXY      14-FEB-2016     3-MAR-2016

目标是限制记录的插入,如果它的start_date位于同名的任何现有记录之间。

1 个答案:

答案 0 :(得分:1)

您可以使用以下查询:

DECLARE @from DATE = '2016-02-10'
DECLARE @to DATE = '2016-02-12'

INSERT INTO mytable (Name, Start_Date, End_Date)
SELECT Name, start_date, end_date
FROM (VALUES ('XXY', @from, @to)) AS t(Name, start_date, end_date)
WHERE NOT EXISTS (SELECT 1
                  FROM mytable AS m
                  WHERE m.name = t.Name AND 
                  (t.start_date <= m.End_Date AND t.end_date >= m.Start_Date))

要插入的值用于构造带有VALUES表值构造函数的内联表。使用NOT EXISTS我们可以过滤掉任何重叠的行,只保留不重叠的行。

Demo here