Php 时间表MySQL查询

Php 时间表MySQL查询,php,mysql,database-design,Php,Mysql,Database Design,我在MySQL中有一个工作时间卡,但我无法使用VIEWs或FUNCTIONs计算时间。我想使用MySQL函数调用,例如getTodaysHours(user CHAR(45))返回用户一天的小时数(包括打卡后的小时数)。问题是我不知道如何在函数内部执行数学运算 这是我的桌子: 下面是我的“麻烦”程序: DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `getTodaysHours`(OUT hours INT, IN user

我在
MySQL
中有一个工作时间卡,但我无法使用
VIEW
s或
FUNCTION
s计算时间。我想使用
MySQL
函数调用,例如
getTodaysHours(user CHAR(45))
返回用户一天的小时数(包括打卡后的小时数)。问题是我不知道如何在函数内部执行数学运算

这是我的桌子:

下面是我的“麻烦”程序:

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `getTodaysHours`(OUT hours INT, IN user CHAR(45))
BEGIN
  SELECT SUM(timestamp) FROM info
  WHERE DATE( FROM_UNIXTIME(timestamp-25200) )=CURDATE() AND
  fullname=user
  ORDER BY timestamp ASC;
END

显然,
SUM()
不是我想要使用的,但我希望其余的都能使用。

如果人们可以在同一天多次打卡,那么仅使用一条纯SQL语句和上面显示的数据库结构将很难做到这一点

如果它知道你每天只能签入/签出一次,那么这里就有一些有用的东西

SELECT COALESCE(out.timestamp, UNIX_TIMESTAMP()) - in.timestamp
FROM info in
LEFT OUTER JOIN info out on in.fullname = out.fullname
WHERE in.inout = 'in'
AND out.inout = 'out'
AND DATEDIFF( FROM_UNIXTIME(in.timestamp),CURDATE()) = 0
AND DATEDIFF( FROM_UNIXTIME(out.timestamp),CURDATE()) = 0 
如果您添加一个列来跟踪成对的输入/输出,那么比较起来就很容易了,因为您可以加入该列。按照现在的方式,您必须进行相关的子选择,以查找输入后的下一个最近的输出


总而言之,您可能应该将此过程化,因为如果数据不符合查询的预期(上面的两个ins now outs案例),那么单个SQL语句不会返回相当大的错误。

因此,ericfoss似乎已经连续签入两次,并且没有任何签出干预。那么,他是否在131029200到1319610596之间工作?或者从
1319587159
139610596
?它需要支持多个输入和输出以及具有奇数冲头的报告天数。奇数冲床很容易计数()!=即使如此,但在一天中,奇怪的一击意味着他/她仍在工作,所有的数学都需要相应地做出反应。可能的输出为0、开始-结束和开始电流。所有错误都返回0。