【问题标题】:compare two dates in same column in mysql比较mysql同一列中的两个日期
【发布时间】:2018-07-18 18:48:06
【问题描述】:

我们的生物特征数据包含三列 Employee id、TimeIn 和 autoincrement id。 我们必须找出员工的工作时间,但员工可能一天进出两三次。 如何找出他的进出时间。没有我们说进出的列。我们还做了 max(TimeIn) 和 min(TimeIn) 的区别。但在我们的案例中,这是不可能的,因为员工在一天中的任何时间和多次进出。

   13   2017-10-31 23:15:11 1   255 1   0
   13   2017-10-31 23:15:27 1   255 1   0
    3   2017-11-01 05:54:06 1   255 1   0
    2   2017-11-01 05:54:31 1   255 1   0
   11   2017-11-01 05:55:58 1   255 1   0
    1   2017-11-01 05:56:24 1   255 1   0
   14   2017-11-01 06:02:23 1   255 1   0
    8   2017-11-01 07:54:24 1   255 1   0
    8   2017-11-01 07:54:27 1   255 1   0
    7   2017-11-01 08:06:37 1   255 1   0
   13   2017-11-01 08:29:52 1   255 1   0
   10   2017-11-01 09:54:41 1   255 1   0
   15   2017-11-01 10:44:17 1   255 1   0
    4   2017-11-01 11:00:28 1   255 1   0
   14   2017-11-01 11:00:59 1   255 1   0
    5   2017-11-01 11:24:50 1   255 1   0
    9   2017-11-01 12:46:32 1   255 1   0
    6   2017-11-01 12:58:24 1   255 1   0
   11   2017-11-01 13:00:18 1   255 1   0
    1   2017-11-01 13:00:28 1   255 1   0
    2   2017-11-01 16:06:14 1   255 1   0
    2   2017-11-01 16:06:24 1   255 1   0

【问题讨论】:

  • 阅读stackoverflow.com/help/how-to-ask,然后更新您的问题。
  • 我很好奇,你为什么不包括TimeOut 列?您如何知道员工是否超时?
  • 你是说TimeIn 实际上不是TimeIn?实际上是TimeCardSwiped 什么的?那么,第一次“滑动”是隐式 In,下一次“滑动”是隐式 out?如果是这样,是否曾经可以在不“刷卡”的情况下进出? (例如获得临时通行证和保安人员嗡嗡声?)我假设有些人有时会在午夜之前“刷卡”,然后在第二天“刷卡”? (夜班)。请仔细考虑所有类似的事件,并对所有可能发生的情况进行非常的具体描述。
  • 我们像这样从指纹机获取数据,它们没有单独的 TimeIn 和 TimeOut 列。所以只有一个列,我们必须通过它找出像这样的时间....如果第一个条目是平均 TimeIn,第二个条目是 TimeOut,第三个是 TimeIn,第四个是 TimeOut,依此类推....对于一名员工.

标签: php mysql sql biometrics


【解决方案1】:

following没有进出,你只能假设第一个输入为IN,下一个为Out。

您可以内部连接到下一个值以获得时间差异,而不是仅过滤奇数值(偶数将超时)

select a.row, a.empid, timestampdiff(second,a.timein, ifnull(b.timeout,date_add(date(a.timein) , interval 1 day))) timeinsec from 
(SELECT  @row_num := IF(@prev_value=o.empid,@row_num+1,1) AS Row,
    empid ,timein,       
   @prev_value := o.empid
FROM Table1 o,
  (SELECT @row_num := 1) x,
  (SELECT @prev_value := '') y
 ORDER BY o.empid,timein asc
 ) a 

 join

 (SELECT  @row_num := IF(@prev_value2=o.empid,@row_num+1,1) AS Row,
    empid ,timein as timeout,       
   @prev_value2 := o.empid
  FROM Table1 o,
  (SELECT @row_num := 1) x,
  (SELECT @prev_value2 := '') y
  ORDER BY o.empid,timein asc) b
 on a.empid=b.empid and a.row=b.row-1
 where mod(a.row,2)=1

编辑

  1. Datediff 更改为 timestampdiff
  2. 空情况处理

【讨论】:

  • Vishal 它的作品,但是当那天错误地没有出来时,结果就会出错,即。 0.
  • 这在逻辑上是正确的。如果有人不退房,那么您将如何计算其在职时间?但是,有一种解决方法,如果它为空,您可以设置一天中的任何固定时间。
  • 您会在 SQL 查询中添加 12:00 am 作为固定时间吗?
  • 绝对完美。 :)
【解决方案2】:
SELECT SUM(HOUR(TimeIn))  FROM table_biometric  group by DATE(TimeIn),Employee_id 

使用查询,您将获得每个员工每天的总工作小时数

如果你想用一个函数计算一天的小时数,你可以这样做

最后你可以使用 datetime 函数来获得其他帮助

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html

【讨论】:

  • 我们处理您的查询,我们弄错了时间。如果员工“进入”他扫描拇指,那么当“离开”他再次扫描时,日期时间仅输入一列。其次,员工再次扫描他的手指以查找条目,并在几个小时后进行手指扫描。这意味着我们必须计算一天内两对进出的小时数
  • 是否有一个列来区分日期时间“in”和“out”
  • 我们得到两个条目,一个是 IN,另一个是 OUT
  • 1 2017-11-01 05:56:24 1 2017-11-01 13:00:28 1
  • EmpID DateTime 13 2017-10-31 05:15:11 13 2017-10-31 13:45:27 13 2017-10-31 23:15:11 13 2017-10-31 23 :45:27 员工 13 有四个记录,我们将其视为第一个是 IN 第二个是 Out 计算此期间的小时数。然后第三是 IN,四是 Out,我们计算此期间的小时数。
【解决方案3】:

嗯,我不知道你的表格列。有describe your_table_name 查询的结果会很高兴。

但您可以根据需要调整此查询:

SELECT
  TIME_FORMAT(SEC_TO_TIME(sum(TIME_TO_SEC(t1.your_datetime_column_name))), "%h:%i") AS diff

from table t1
LEFT join table t2
on  t1.primary_key_column_name != t2.primary_key_column_name
  WHERE t1.primary_key_column_name IS NOT NULL

【讨论】:

  • 你没有提到EmployeeID列。
  • 我相信那是你的primary_key_column_name。因为我不知道你的列名...
猜你喜欢
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多