【问题标题】:Get all Employees for dates from tables for today's and last date从今天和最后一个日期的表格中获取所有员工的日期
【发布时间】:2015-01-02 07:33:54
【问题描述】:

我正在尝试创建一个查询来获取今天和最后一个日期的所有员工。

我有两列 in_date 和 out_date。因此,如果in_dateout_date 两列都有记录,我不想获取这些记录。

我只想获取设置了 in_date 但未设置 out_date 的今天和昨天日期的记录,以及那些甚至没有 in_date 和 out_date 记录的记录。

这样简单来说就是从考勤表中获取所有未设置 in_date 和 out_date 的记录。如果两者都设置,则不要获取记录。

这是我到目前为止的查询,不确定我的方法是否正确:

SELECT 
  `E`.`employee_id` AS EmployeeID,
  `E`.`full_name` AS EmployeeNam,
  `ATT`.`in_date` AS EmployeeInDate,
  `ATT`.`out_date` AS EmployeeOutDate,
  `ATT`.`in_time` AS EmployeeInTime,
  `ATT`.`out_time` AS EmployeeOutTime 
FROM
  (`employee` E) 
  INNER JOIN `employment` ET 
    ON `E`.`employee_id` = `ET`.`employee_id` 
    AND ET.current = 1 
  INNER JOIN `employee_project` EP 
    ON `E`.`employee_id` = `EP`.`employee_id` 
  LEFT JOIN `attendence` ATT 
    ON `ATT`.`employee_id` = `E`.`employee_id`  
  INNER JOIN `posting` P 
    ON `P`.`employement_id` = `ET`.`employment_id` 
    AND P.current = 1 
    AND P.status = 2 
WHERE `E`.`enrolled` = 1 -- AND ATT.`in_date` = CURDATE() - 1 OR ATT.`in_date` = CURDATE()
GROUP BY `E`.`employee_id`

这是我现在得到的记录:

我在哪里试过这个

AND ATT.`in_date` = CURDATE() - 1 OR ATT.`in_date` = CURDATE()

不确定获取今天和昨天日期的正确方法?如果不正确,还请说明获取今天和以前日期的正确方法。

另外它没有让我得到空日期的记录,我如何获得空日期?

空箱注意事项: 我只想要空的情况下,如果员工今天没有出勤所以它是空的,那么我想要今天的空或最后一天的空(如果存在)(不是所有的空记录)。

更新

这次我尝试了 UNION 方式,但是对于 NULL,联合​​也联合了两个空值?那么如何区分 null 是在哪个日期呢?

SELECT 
  `E`.`employee_id` AS EmployeeID,
  `E`.`full_name` AS EmployeeNam,
  `ATT`.`in_date` AS EmployeeInDate,
  `ATT`.`out_date` AS EmployeeOutDate,
  `ATT`.`in_time` AS EmployeeInTime,
  `ATT`.`out_time` AS EmployeeOutTime 
FROM
  (`employee` E) 
  INNER JOIN `employment` ET 
    ON `E`.`employee_id` = `ET`.`employee_id` 
    AND ET.current = 1 
  INNER JOIN `employee_project` EP 
    ON `E`.`employee_id` = `EP`.`employee_id` 
  LEFT JOIN `attendence` ATT 
    ON `ATT`.`employee_id` = `E`.`employee_id`  AND ATT.`in_date` = CURDATE() - 1 -- Get Yesterdays Records
  INNER JOIN `posting` P 
    ON `P`.`employement_id` = `ET`.`employment_id` 
    AND P.current = 1 
    AND P.status = 2 
WHERE `E`.`enrolled` = 1
GROUP BY `E`.`employee_id` , ATT.in_date
UNION
SELECT 
  `E`.`employee_id` AS EmployeeID,
  `E`.`full_name` AS EmployeeNam,
  `ATT`.`in_date` AS EmployeeInDate,
  `ATT`.`out_date` AS EmployeeOutDate,
  `ATT`.`in_time` AS EmployeeInTime,
  `ATT`.`out_time` AS EmployeeOutTime 
FROM
  (`employee` E) 
  INNER JOIN `employment` ET 
    ON `E`.`employee_id` = `ET`.`employee_id` 
    AND ET.current = 1 
  INNER JOIN `employee_project` EP 
    ON `E`.`employee_id` = `EP`.`employee_id` 
  LEFT JOIN `attendence` ATT 
    ON `ATT`.`employee_id` = `E`.`employee_id` AND ATT.`in_date` = CURDATE() -- Get Todays Dates
  INNER JOIN `posting` P 
    ON `P`.`employement_id` = `ET`.`employment_id` 
    AND P.current = 1 
    AND P.status = 2 
WHERE `E`.`enrolled` = 1
GROUP BY `E`.`employee_id`

【问题讨论】:

  • 您需要不考虑天数?...这意味着您只需要未设置 in_date 和 out_date 正确的记录!!!!!!!
  • @Vamshi.goli 是的,这就是我想要的..
  • 我希望这个逻辑可以帮助你......当 in_date 或 out_date 中有 null 时,然后获取那些记录

标签: php mysql


【解决方案1】:

你可以在mysql中尝试类似的东西:

WHERE (ATT.in_date BETWEEN DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY) AND CURRENT_TIMESTAMP)

DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 1 DAY) --> 今天日期 - 1 天。

看看这个函数DATE_SUB

希望对你有帮助。

【讨论】:

  • 表中有两条正确的记录,今天和昨天,而且我没有得到 NULL 记录?
【解决方案2】:

如果我理解正确的话:

AND ATT.in_date BETWEEN CONCAT(CAST(DATE(CURDATE() - 1) AS CHAR), ' 00:00:00') AND CONCAT(CAST(DATE(CURDATE()) AS CHAR), ' 23:59:59') AND (ATT.out_date IS NULL OR ATT.out_date = '0000-00-00 00:00:00')

应该给你你想要的,虽然有点乱:p

更新 如果你还想要 in_date 和 out_date 为 NULL 的记录,试试这个:

AND (ATT.in_date BETWEEN CONCAT(CAST(DATE(CURDATE() - 1) AS CHAR), ' 00:00:00') AND CONCAT(CAST(DATE(CURDATE()) AS CHAR), ' 23:59:59') AND (ATT.out_date IS NULL OR ATT.out_date = '0000-00-00 00:00:00')) OR (ATT.in_date IS NULL OR ATT.in_date = '0000-00-00 00:00:00' AND ATT.out_date IS NULL OR ATT.out_date = '0000-00-00 00:00:00')

【讨论】:

  • ` 错误代码:1064 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 'SELECT CONCAT(CAST(DATE(CURDATE()) AS CHAR), '23:59:59') GROUP BY E.employee' at line 21 附近使用的正确语法
  • 哎呀,我的“测试”代码留在那里了。如果您想再试一次,sn-p 会更新。感谢您指出。
  • 是的,错误消失了。问题是我只得到那些日期出席的员工的结果。但是如果今天的日期没有在出勤表中注册,我希望这些日期为 null 或 0000-00-00 ..
  • 假设您的 out_date 的默认值为“NULL”,我已经再次更新了 sn-p,它应该可以满足您的需求。
  • 是的,它更像是你更新的地方,但我的日期有误??我想要今天和昨天的日期。它也显示了一些非常古老的日子。
【解决方案3】:
AND (
      (ATT.`in_date` >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND (ATT.`out_date` IS NULL OR ATT.`out_date` = '0000-00-00'))
    OR 
      ((ATT.`in_date` IS NULL OR ATT.`in_date` = '0000-00-00') AND (ATT.`out_date` IS NULL OR ATT.`out_date` = '0000-00-00'))
    )

上述条件应返回以下记录:

  • ATT.in_date 等于或大于昨天的日期(假设您将来没有记录)AND ATT.out_date 未设置(NULL 或 '0000-00-00')
  • ATT.in_date 未设置(NULL 或 '0000-00-00')AND ATT.out_date 未设置(NULL 或 '0000-00-00')。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多