我有两个表,一个叫做check_ins,另一个叫做假期。
check_ins有一个datetime_start和datetime_end列(除了此问题不需要的其他内容)。假期表的日期范围为两列,用于假期的开始和结束。
我需要弄清楚假日范围之前和之后的一天是谁,以确定谁获得假期工资。换句话说,我只需要同一名员工在一天前和一天后的表格中的结果,忽略其余的。
我整天都在绞尽脑汁想要找到一种方法来做到这一点并且一无所获。我在这里吠叫错了吗?我应该通过PHP吗?
谢谢!
编辑:这是我使用过的,虽然我已经知道了,直到我意识到他们可能会在一天内进行多次签到:
SELECT DISTINCT count(check_ins.Employee_ID), check_ins.ShiftStart_Datetime, check_ins.ShiftEnd_Datetime, holidays.* FROM check_ins, holidays WHERE holidays.ID = 2 AND DATE(DATE_ADD(Datefrom, INTERVAL -1 DAY)) = DATE(ShiftStart_Datetime) GROUP BY Employee_ID HAVING count(check_ins.Employee_ID) >1 UNION SELECT DISTINCT check_ins.Employee_ID, check_ins.ShiftStart_Datetime, check_ins.ShiftEnd_Datetime, holidays.* FROM check_ins, holidays WHERE DATE(DATE_SUB(Dateto, INTERVAL -1 DAY)) = DATE(ShiftStart_Datetime) GROUP BY Employee_ID HAVING count(check_ins.Employee_ID) >1
答案 0 :(得分:0)
你可以通过2个查询中的php来做到这一点,但你为什么要......这会很有趣!
SELECT * FROM check_ins
LEFT JOIN holidays AS holi_before
ON (
datediff(holi_before.datetime_end,check_ins.datetime_end) <= 1
)
LEFT JOIN holidays AS holi_after
ON (
holi_before.id = holi_after.id
AND datediff(holi_after.datetime_end,check_ins.datetime_end) >= 1
)
应该这样做(可能需要稍微调整一下dateiff比较才能完全正确。)
没有测试它,但我希望它能给你正确的推动: - )
答案 1 :(得分:0)
您可以(内部)加入check_ins
表两次。假期开始前一天和后一天一次。
如果datetime_start
和datetime_end
可能有不同的日期,则需要使用BETWEEN
。将它们都投放到日期而不是日期时间,因为你不关心时间。
如果员工在一天内有多次检查,请添加GROUP BY
。
SELECT holidays.id AS holiday_id, ci_before.employee_id FROM holidays
INNER JOIN check_ins ci_before ON holidays.holiday_start - INTERVAL 1 DAY
BETWEEN DATE(ci_before.datetime_start) AND DATE(ci_before.datetime_end)
INNER JOIN check_ins ci_after ON holidays.holiday_end + INTERVAL 1 DAY
BETWEEN DATE(ci_after.datetime_start) AND DATE(ci_after.datetime_end)
AND ci_before.employee_id = ci_after.employee_id
GROUP BY ci_before.employee_id
使用过的表是
CREATE TABLE `holidays` (id int, holiday_start date, holiday_end date);
CREATE TABLE `check_ins` (employee_id int, datetime_start datetime, datetime_end datetime);
holidays.id
是假期的ID,而不是员工。