У меня есть таблица с диапазонами дат. Я хочу искать промежутки между этими диапазонами. Я понял, что могу оставить таблицу соединений и вычислить разницу.
Текущая таблица:
date_begin date_end
2010-08-01 2010-08-15
2010-08-16 2010-08-30
2010-08-31 2010-09-12
2010-10-01 2010-10-15
Я хочу получить:
date_begin date_end - date_begin2 DATEDIFF(date_begin2 - date_end)
2010-08-01
2010-08-01 2010-08-15 2010-08-16 ...
2010-08-16 2010-08-30 2010-08-31 ...
2010-08-31 2010-09-12 2010-10-01 ...
2010-10-01 2010-10-15
Я использую следующий запрос:
SELECT pay1.date_begin, pay1.date_end,
pay2.date_begin, pay2.date_end, DATEDIFF( pay2.date_begin, pay1.date_end)
FROM `payment_employees` AS pay1
LEFT JOIN `payment_employees` AS pay2 ON pay2.date_begin > pay1.date_end
GROUP BY pay1.date_begin
ORDER BY pay1.date_begin ASC
Но результат
pay1.date_begin date_end pay2.date_begin date_end difference
2010-08-01 2010-08-15 2010-08-31 2010-09-12 16 wrong
2010-08-16 2010-08-30 2010-08-31 2010-09-12 1 correct
2010-08-31 2010-09-12 2010-10-01 2010-10-15 19 correct
2010-10-01 2010-10-15 NULL NULL
Если я удалю GROUP BY, я вижу, что в результате есть правильные строки. Я просто не могу понять, как их получить.
Есть ли способ сортировки таблицы перед объединением?
Если вы хотите, чтобы строки в ваших таблицах были отсортированы до объединения, вы можете заменить одну или обе реальные таблицы в вашем соединении на производные таблицы, подобные этому...
SELECT pay1.date_begin,
pay1.date_end,
pay2.date_begin,
pay2.date_end,
DATEDIFF( pay2.date_begin, pay1.date_end)
FROM (SELECT *
FROM `payment_employees`
ORDER BY date_begin) AS pay1
LEFT JOIN (SELECT *
FROM `payment_employees`
ORDER BY date_end) AS pay2
ON pay2.date_begin > pay1.date_end
GROUP BY pay1.date_begin
ORDER BY pay1.date_begin ASC
Я не уверен, что это решит проблему существа.