我想创建一个将数据插入表格的查询,并检查我的日期范围是否与现有的日期范围重叠。
我创建了以下工作查询,但它插入了2行,具有相同的数据。你能找到任何错误吗?
INSERT INTO infoscreen_times (screen_id, start, end, view_id)
SELECT ?, ?, ?, ?
FROM infoscreen_screens
WHERE EXISTS (
SELECT id
FROM infoscreen_times
WHERE ? BETWEEN start AND end
AND screen_id = ?
OR ? BETWEEN start AND end
AND screen_id = ?
OR ? <= start
AND ? >= end
AND screen_id = ?) IS FALSE
start表示Start-Timestamp,end表示End-Timestamp。在子查询中,我想检查我想要插入的时间戳是否相互重叠。如果他们这样做我想得到一个错误,如果他们不查询插入数据。
提前致谢。
答案 0 :(得分:1)
我相信这是你想要的逻辑。最重要的是,您需要not exists
。其次,您需要使日期算术正确:
INSERT INTO infoscreen_times (screen_id, start, end, view_id)
SELECT ?, ?, ?, ?
FROM infoscreen_screens iss
WHERE NOT EXISTS (SELECT 1
FROM infoscreen_times ist
WHERE ist.screen_id = iss.screen_id AND
? <= ist.end AND -- ? is the begin time
? >= ist.begin -- ? is the end time
);
答案 1 :(得分:0)
您需要一个生成布尔值的SQL表达式,具体取决于一个日期范围是否与另一个日期范围重叠。见this SO answer
您使用的内容似乎不正确。我不能确切地诊断原因,或者在不知道表模式的情况下建议更好的查询。你可以发帖吗?
答案 2 :(得分:0)
您应该使用括号来区分OR运算符的不同部分。我认为答案是:
INSERT INTO infoscreen_times (screen_id, start, end, view_id)
SELECT ?, ?, ?, ?
FROM infoscreen_screens
WHERE EXISTS (SELECT id FROM infoscreen_times WHERE (? BETWEEN start AND end AND screen_id = ?) OR (? BETWEEN start AND end AND screen_id = ?) OR (? <= start AND ? >= end AND screen_id = ?))
IS FALSE
但是,我不知道MySql中这些问号的含义。 :)