如果日期与现有日期不重叠,则将日期范围更新为日期列

时间:2016-10-12 18:54:37

标签: sql postgresql validation datetime

答案的后续问题here。由于我不能对答案发表评论,我不能直接问。

我需要更新一行并仍然检查时间是否与其他条目重叠。但是,我不知道如何更改语句以排除在检查期间查看自身。

使用像这样的Insert语句

INSERT INTO table (name, starttime, endtime) 
SELECT 'test', '2016-10-12 22:00:00', '2016-10-12 23:00:00'
FROM (SELECT 1) x 
LEFT 
JOIN table y 
ON y.starttime < '2016-10-12 23:00:00' AND y.endtime > '2016-10-12 22:00:00' 
WHERE y.id is NULL LIMIT 1;           

如何在检查中排除正在更新的行时,如何修改UPDATE语句以执行相同操作?

UPDATE table SET name = 'test2', starttime = '2016-10-12 22:15:00',
endtime = '2016-10-12 23:00:00'  WHERE id = 1

id是主键,我用它来识别行

1 个答案:

答案 0 :(得分:1)

您可以在not existsinsert查询中使用update

insert into a_table (name, starttime, endtime) 
select 'test', '2016-10-12 22:00:00', '2016-10-12 23:00:00'
where not exists (
    select 1 from a_table
    where starttime < '2016-10-12 23:00:00' and endtime > '2016-10-12 22:00:00'
    );

update a_table 
set name = 'test2', starttime = '2016-10-12 22:15:00', endtime = '2016-10-12 23:00:00'  
where id = 1 
and not exists (
    select 1 from a_table
    where id <> 1 
    and starttime < '2016-10-12 23:00:00' and endtime > '2016-10-12 22:15:00'
    );