我有来自考勤机系统的示例数据表,如下所示:
ID Name In
1 John 2015-04-17 08:00:00
1 John 2015-04-17 16:30:00
1 John 2015-04-20 10:01:00
1 John 2015-04-21 10:00:00
1 John 2015-04-21 19:00:00
这是我的查询:
SELECT a.id AS ID, a.nama AS `Name`, DATE_FORMAT(a.att, '%d-%b-%y') AS `Date`,
DATE_FORMAT(a.att, '%T') as `IN`, DATE_FORMAT(b.att, '%T') AS `OUT`
FROM attendance a
INNER JOIN attendance b
on date(a.att) = date(b.att) AND a.id = b.id
WHERE b.att > a.att
通过上面的查询,我可以将 In(列)时间分成 2 列,像这样 In 和 out:
Id Name Date In Out
1 John 17-Apr-15 08:00:00 16:30:00
1 John 21-Apr-15 10:00:00 19:00:00
问题是,如果用户 John 在外出时忘记使用指纹,例如 4 月 20 日,则不会显示数据。所以,我希望我的输出变成这样:
Id Name Date In Out
1 John 17-Apr-15 08:00:00 16:30:00
1 John 20-Apr-15 10:01:00 NULL
1 John 21-Apr-15 10:00:00 19:00:00
最佳答案
您应该使用 LEFT JOIN 而不是 INNER JOIN。或者您可以改用此查询:
SELECT
Id,
Name,
DATE(att) AS `Date`,
DATE_FORMAT(MIN(att), '%T') AS `In`,
CASE WHEN MAX(att)<>MIN(att) THEN DATE_FORMAT(MAX(att), '%T') END AS `Out`
FROM
attendance
GROUP BY
Id, Name, DATE(att)
请看 fiddle here .
关于mysql - 显示 MySQL 中 2 个可比记录的 Null 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30300475/