我在MySQL
中有一张工作考勤卡,但我无法使用VIEW
或FUNCTION
来投入时间。我想使用MySQL
函数调用getTodaysHours (user CHAR(45))
来返回用户当天的小时数(包括自打卡后的小时数)。问题是我不知道如何在FUNCTION中执行数学运算。
这是我的表:
这是我的“陷入困境”的程序:
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()
不是我想要使用的,但我希望其余的工作。
答案 0 :(得分:0)
如果人们可以在同一天多次上下班,那么只使用一个带有上面显示的数据库结构的纯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
如果您添加一个跟踪输入/输出对的列,则可以轻松比较,因为您可以加入该列。现在的方式是你必须做一个相关的子选择,以便在输入之后找到下一个最近的。
总而言之,你应该制定这个程序,因为在数据不符合查询期望的情况下,单个SQL语句不会返回正常的错误(现在两个ins已经超出了上述情况)