我想知道為什么這個查詢在不同版本的 MySQL 中顯示不同的結果:
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=409db6dd827acd7bda4ff9723fa108d9
在 MySQL 8 fiddle 中,不應該顯示從 10:00 持續到 10:30 的時間段,因為表中有從 10:00 到 10:30 的約會。
MySQL 5.7:
CREATE TABLE shifts (
id int NOT NULL,
unique_id varchar(255) NOT NULL,
start_date DATETIME NOT NULL,
end_date DATETIME NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE appointments (
id int NOT NULL,
unique_id varchar(255) NOT NULL,
start_date DATETIME NOT NULL,
end_date DATETIME NOT NULL,
shift_id int NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (shift_id) REFERENCES shifts(id)
);
INSERT INTO `shifts` (`id`, `unique_id`, `start_date`, `end_date`)
VALUES
('4596', '614fc0c5dab2485bba8cbbd9eb98aa53', '2022-02-28 10:00:00', '2022-03-15 19:00:00');
INSERT INTO `appointments` (`id`, `unique_id`, `start_date`, `end_date`, `shift_id`)
VALUES
(18382, '1371e41a7cf342bfa279a8b120cc5f43', '2022-02-28 10:00:00', '2022-02-28 10:30:00', 4596),
(18517, '124baaa1aeab421cb288f2b7c7abe89b', '2022-02-28 10:30:00', '2022-02-28 11:00:00', 4596),
(18523, 'aff5abe6e8f84a64ace3277d3cd6dbd1', '2022-02-28 11:00:00', '2022-02-28 12:00:00', 4596),
(18355, 'ec570f9365bb4ad68c7b5ab3b7d9aeea', '2022-02-28 12:00:00', '2022-02-28 12:30:00', 4596),
(18537, 'e1946add03cd412da357b58c93d58c6e', '2022-02-28 12:30:00', '2022-02-28 13:15:00', 4596),
(18540, 'e16af8a053594e8b8340ede302398a22', '2022-02-28 13:30:00', '2022-02-28 14:00:00', 4596),
(18235, 'deac969701ae47f0a78696f12c267475', '2022-02-28 14:00:00', '2022-02-28 14:30:00', 4596),
(18462, '3270929ae6e546fb824e6d3219917b8e', '2022-02-28 14:30:00', '2022-02-28 16:00:00', 4596),
(18544, 'd27bc7ba34a74f078966ebe1567d3181', '2022-02-28 16:00:00', '2022-02-28 16:30:00', 4596),
(18622, '02ca48b35ca3462f9030bcb97ea1dbab', '2022-02-28 16:30:00', '2022-02-28 16:50:00', 4596),
(18545, '4a49c054e59e4514ae2a521b55a7715c', '2022-02-28 16:50:00', '2022-02-28 17:15:00', 4596),
(18351, '6a0d56ad43894b60b4f8a289fbbfff73', '2022-02-28 17:30:00', '2022-02-28 18:15:00', 4596),
(18352, 'accdc12943954ee2bd69ad116c2fef3d', '2022-02-28 18:15:00', '2022-02-28 19:00:00', 4596);
SELECT Available_from, Available_to
FROM (
SELECT COALESCE(@lasttime_to, '2022-02-28 10:00:00') AS Available_from, start_date AS Available_to, @lasttime_to := end_date
FROM (SELECT start_date, end_date
FROM appointments
WHERE shift_id = 4596
AND end_date <= '2022-02-28 19:00:00'
AND start_date >= '2022-02-28 10:00:00'
UNION ALL (
SELECT '2022-02-28 19:00:00', '2022-02-28 19:00:00'
)
UNION ALL (
SELECT '2022-02-28 10:00:00', '2022-02-28 10:00:00'
)
ORDER BY start_date
) e
JOIN (SELECT @lasttime_to := NULL) init) x
WHERE Available_to > DATE_ADD(Available_from, INTERVAL 14 MINUTE);
結果:
Available_from Available_to
2022-02-28 13:15:00 2022-02-28 13:30:00
2022-02-28 17:30:00 2022-02-28 17:30:00
MySQL 8.0:
CREATE TABLE shifts (
id int NOT NULL,
unique_id varchar(255) NOT NULL,
start_date DATETIME NOT NULL,
end_date DATETIME NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE appointments (
id int NOT NULL,
unique_id varchar(255) NOT NULL,
start_date DATETIME NOT NULL,
end_date DATETIME NOT NULL,
shift_id int NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (shift_id) REFERENCES shifts(id)
);
INSERT INTO `shifts` (`id`, `unique_id`, `start_date`, `end_date`)
VALUES
('4596', '614fc0c5dab2485bba8cbbd9eb98aa53', '2022-02-28 10:00:00', '2022-03-15 19:00:00');
INSERT INTO `appointments` (`id`, `unique_id`, `start_date`, `end_date`, `shift_id`)
VALUES
(18382, '1371e41a7cf342bfa279a8b120cc5f43', '2022-02-28 10:00:00', '2022-02-28 10:30:00', 4596),
(18517, '124baaa1aeab421cb288f2b7c7abe89b', '2022-02-28 10:30:00', '2022-02-28 11:00:00', 4596),
(18523, 'aff5abe6e8f84a64ace3277d3cd6dbd1', '2022-02-28 11:00:00', '2022-02-28 12:00:00', 4596),
(18355, 'ec570f9365bb4ad68c7b5ab3b7d9aeea', '2022-02-28 12:00:00', '2022-02-28 12:30:00', 4596),
(18537, 'e1946add03cd412da357b58c93d58c6e', '2022-02-28 12:30:00', '2022-02-28 13:15:00', 4596),
(18540, 'e16af8a053594e8b8340ede302398a22', '2022-02-28 13:30:00', '2022-02-28 14:00:00', 4596),
(18235, 'deac969701ae47f0a78696f12c267475', '2022-02-28 14:00:00', '2022-02-28 14:30:00', 4596),
(18462, '3270929ae6e546fb824e6d3219917b8e', '2022-02-28 14:30:00', '2022-02-28 16:00:00', 4596),
(18544, 'd27bc7ba34a74f078966ebe1567d3181', '2022-02-28 16:00:00', '2022-02-28 16:30:00', 4596),
(18622, '02ca48b35ca3462f9030bcb97ea1dbab', '2022-02-28 16:30:00', '2022-02-28 16:50:00', 4596),
(18545, '4a49c054e59e4514ae2a521b55a7715c', '2022-02-28 16:50:00', '2022-02-28 17:15:00', 4596),
(18351, '6a0d56ad43894b60b4f8a289fbbfff73', '2022-02-28 17:30:00', '2022-02-28 18:15:00', 4596),
(18352, 'accdc12943954ee2bd69ad116c2fef3d', '2022-02-28 18:15:00', '2022-02-28 19:00:00', 4596);
SELECT Available_from, Available_to
FROM (
SELECT COALESCE(@lasttime_to, '2022-02-28 10:00:00') AS Available_from, start_date AS Available_to, @lasttime_to := end_date
FROM (SELECT start_date, end_date
FROM appointments
WHERE shift_id = 4596
AND end_date <= '2022-02-28 19:00:00'
AND start_date >= '2022-02-28 10:00:00'
UNION ALL (
SELECT '2022-02-28 19:00:00', '2022-02-28 19:00:00'
)
UNION ALL (
SELECT '2022-02-28 10:00:00', '2022-02-28 10:00:00'
)
ORDER BY start_date
) e
JOIN (SELECT @lasttime_to := NULL) init) x
WHERE Available_to > DATE_ADD(Available_from, INTERVAL 14 MINUTE);
結果:
Available_from Available_to
2022-02-28 10:00:00 2022-02-28 10:30:00
2022-02-28 13:15:00 2022-02-28 13:30:00
2022-02-28 17:15:00 2022-02-28 17:30:00
uj5u.com熱心網友回復:
您的子查詢e按 排序start_date,這是不確定的,因為可以有幾行具有相同的值。
使用 MySQL 5.7:
- 此子查詢的第一行是您通過
union. 它from_date的 is2022-02-28 10:00:00和 itsend_dateis2022-02-28 10:00:00,這將是Available_from下一行的 the ,因為您的查詢使用@lasttime_to. - 下一行是與約會 18382 相關的行,它變為“從 2022-02-28 10:00:00 到 2022-02-28 10:00:00”,
end_date設定為2022-02-28 10:30:00,這將是Available_from下一個排。 - 下一行是與預約 18517 相關的行,它變為“從 2022-02-28 10:30:00 到 2022-02-28 10:30:00”
所以在這里,這 3 行都不符合條件Available_to > DATE_ADD(Available_from, INTERVAL 14 MINUTE);
使用 MySQL 8:
- 該子查詢的第一行是與約會 18382 相關的,而不是假的。它
from_date的 is2022-02-28 10:00:00和 itsend_dateis2022-02-28 10:30:00,這將是Available_from下一行的 the ,因為您的查詢使用@lasttime_to. - 下一行是您通過
union. 它變成“2022-02-28 10:30:00 2022-02-28 10:00:00”(!),它end_date是2022-02-28 10:00:00,這將是Available_from下一行的。 - 下一行是與約會 18517 相關的行,即“2022-02-28 10:00:00 to 2022-02-28 10:30:00”。
在這里,第三行與條件匹配Available_to > DATE_ADD(Available_from, INTERVAL 14 MINUTE);,這就是您獲得額外行的原因。
TL;DR:Available_from您的行的值依賴于子查詢獲得的非確定性順序e。然后,您的結果從一個引擎到另一個引擎并不一致。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/430925.html
上一篇:將CSV匯入MySQL時將String或Float轉換為Int
下一篇:AndroidNavigationDrawer和Toolbar在所有Fragment中,加上TabLayout合二為一
