我有这个查询
SELECT te.user_name, LEFT(te.entry_datetime, 10) AS entry_date, cin.entry_datetime AS timein, cout.entry_datetime AS timeout
FROM time_entries te
LEFT JOIN (SELECT user_name, LEFT(entry_datetime, 10) AS entry_date, MIN(entry_datetime) AS entry_datetime
FROM time_entries
WHERE entry_type = 'Time In'
GROUP BY user_name, entry_date
) cin ON cin.user_name = te.user_name AND cin.entry_date = LEFT(te.entry_datetime, 10)
LEFT JOIN (SELECT user_name, LEFT(entry_datetime, 10) AS entry_date, MAX(entry_datetime) AS entry_datetime
FROM time_entries
WHERE entry_type = 'Time Out'
GROUP BY user_name, entry_date
) cout ON cout.user_name = te.user_name AND cout.entry_date = LEFT(te.entry_datetime, 10)
GROUP BY te.user_name, entry_date;
这是输出SQLFIDDLE
USER_NAME| ENTRY_DATE | TIMEIN | TIMEOUT
User1 | 28-JUL-13 | 16:40:40 | 16:42:30
User2 | 28-JUL-13 | 16:41:13 | 16:41:15
但是我在解决方案中发现了一个漏洞,他们是一些通宵工作并在第二天超时的员工。因此,当用户在 2013 年 7 月 28 日和 2013 年 7 月 29 日超时时,这将是输出。SQLFIDDLE
USER_NAME| ENTRY_DATE | TIMEIN | TIMEOUT
User1 | 28-JUL-13 | 16:40:40 | null
User1 | 29-JUL-13 | null | 16:42:30
User2 | 28-JUL-13 | 16:41:13 | 16:41:15
逻辑是正确的,但在我的情况下似乎不合适。我想只是为了让工作更轻松,只需删除 ENTRY_DATE 并且只有 3 列 USER_NAME、TIMEIN 和 TIMEOUT。像这样的东西。
USER_NAME | TIMEIN | TIMEOUT
User1 | 28-JUL-13 16:40:40 | 29-JUL-13 16:42:30
User2 | 28-JUL-13 16:41:13 | 28-JUL-13 16:41:15
谁能帮我弄清楚我要改变什么或提出一个新的解决方案?谢谢。