如何使用日历填补日期空白 table
How to fill date gaps using calendar table
我尝试使用日历 table 但我的查询仍然显示我的记录中存在日期间隔,我的内部联接是否有误?这是我的 mysql 查询:
SELECT c.dt,a.TimeIn,a.LunchOut,a.LunchIn,a.TimeOut FROM cal c
RIGHT JOIN attendance a ON a.ValidDate = c.dt WHERE c.dt BETWEEN DATE('2015-01-01')
AND DATE('2015-01-30') AND a.EmpID = '01409159'
您的 RIGHT JOIN 保留了 attendance
table 中的每一行,但删除了 cal
table.
中的不匹配角色
您需要一个 LEFT JOIN,这样您就可以保留 cal
table 中的每一行。此外,您的 a.col = value
WHERE 子句将您的 LEFT JOIN 转换为 INNER JOIN。尝试将 a.EmpID
的选择性从 WHERE 子句移动到 ON 子句。
此外,您应该使用 >=
和 <
而不是 BETWEEN 来处理日期范围,因为 BETWEEN
有时会弄乱日期范围的结尾。
SELECT c.dt,
a.TimeIn, a.LunchOut, a.LunchIn, a.TimeOut
FROM cal c
LEFT JOIN attendance a ON a.ValidDate = c.dt AND a.EmpID = '01409159'
WHERE c.dt >= '2015-01-01'
AND c.dt < '2015-01-01' + INTERVAL 1 MONTH
我尝试使用日历 table 但我的查询仍然显示我的记录中存在日期间隔,我的内部联接是否有误?这是我的 mysql 查询:
SELECT c.dt,a.TimeIn,a.LunchOut,a.LunchIn,a.TimeOut FROM cal c
RIGHT JOIN attendance a ON a.ValidDate = c.dt WHERE c.dt BETWEEN DATE('2015-01-01')
AND DATE('2015-01-30') AND a.EmpID = '01409159'
您的 RIGHT JOIN 保留了 attendance
table 中的每一行,但删除了 cal
table.
您需要一个 LEFT JOIN,这样您就可以保留 cal
table 中的每一行。此外,您的 a.col = value
WHERE 子句将您的 LEFT JOIN 转换为 INNER JOIN。尝试将 a.EmpID
的选择性从 WHERE 子句移动到 ON 子句。
此外,您应该使用 >=
和 <
而不是 BETWEEN 来处理日期范围,因为 BETWEEN
有时会弄乱日期范围的结尾。
SELECT c.dt,
a.TimeIn, a.LunchOut, a.LunchIn, a.TimeOut
FROM cal c
LEFT JOIN attendance a ON a.ValidDate = c.dt AND a.EmpID = '01409159'
WHERE c.dt >= '2015-01-01'
AND c.dt < '2015-01-01' + INTERVAL 1 MONTH