我有一张包含日期范围的表格。我想寻找这些范围之间的差距。 我已经想通了,我可以将联合表留给自己并计算差异。
当前表:
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,我可以看到结果中有正确的行。我只是无法弄清楚如何得到它们。
有没有办法在加入之前对表进行排序?
答案 0 :(得分:2)
如果希望在连接之前对表中的行进行排序,则可以将连接中的一个或两个实际表替换为这样的派生表...
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
我不确定这是否能解决实质性问题。