PHP / MySQL选择同一个表中范围的前一天和后一天

时间:2013-12-09 23:32:46

标签: php mysql

我有两个表,一个叫做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

2 个答案:

答案 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_startdatetime_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

See the SQL fiddle here

使用过的表是

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,而不是员工。