如果条目的日期范围已经存在,则在插入时验证记录并限制插入
Validating record on insert and restricting insert if the date range of entry already exists
我的Table结构如下
select * from 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
数据存在同名日期范围重叠的问题。
For example, XXY
XXY 18-FEB-2016 3-MAR-2016
无效,因为 start_date 在现有记录的日期范围内
XXY 14-FEB-2016 3-MAR-2016
objective 是为了限制记录的插入,如果它 start_date 位于同名的任何现有记录之间。
您可以使用以下查询:
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))
要插入的值用于构造内联 table 和 VALUES
table 值构造函数。使用 NOT EXISTS
我们可以过滤掉任何重叠的行,只保留不重叠的行。
我的Table结构如下
select * from 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
数据存在同名日期范围重叠的问题。
For example, XXY
XXY 18-FEB-2016 3-MAR-2016
无效,因为 start_date 在现有记录的日期范围内
XXY 14-FEB-2016 3-MAR-2016
objective 是为了限制记录的插入,如果它 start_date 位于同名的任何现有记录之间。
您可以使用以下查询:
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))
要插入的值用于构造内联 table 和 VALUES
table 值构造函数。使用 NOT EXISTS
我们可以过滤掉任何重叠的行,只保留不重叠的行。