我试图找出我的时钟查询中的错误。突破打击时间是中午12点,突破时间是下午12:30。我在mysql中使用timediff来计算差异。我将突破时间传递给timediff函数,然后传递时间。它返回正确的分钟,但它也返回-12小时。当我在timediff函数中交换breakin和breakout时,它会在正确的分钟内返回正12小时。
我想有人可能想查看查询。警告:它又大又丑。 查询:
SELECT CONCAT(pe.first, ' ', pe.last) AS Name,
U.EmpID AS 'Empl ID',
DATE_FORMAT(U.`time`, '%m-%d-%Y') AS 'Punch Date',
DATE_FORMAT(U.`time`, '%W') AS 'Weekday',
TIME_FORMAT(SEC_TO_TIME(SUM(U.delta)), '%H:%i') AS 'Time Worked',
TIME_FORMAT(
TIMEDIFF(
(SELECT PunchDateTime
FROM timeclock_punchlog tp
WHERE PunchEvent = 'breakout'
AND DATE(tp.PunchDateTime) = DATE(U.time)
AND tp.EmpID = U.EmpID),
(SELECT PunchDateTime
FROM timeclock_punchlog tp
WHERE PunchEvent = 'breakin'
AND DATE(tp.PunchDateTime) = DATE(U.time)
AND tp.EmpID = U.EmpID)),
'%h hrs, %i min.')
AS Lunch
FROM ((SELECT `enter`.EmpID,
`enter`.PunchDateTime AS `time`,
DATE_FORMAT(`enter`.PunchDateTime, '%m-%d-%Y')
AS 'Punch Date',
TIMESTAMPDIFF(SECOND,
`enter`.PunchDateTime,
'2003-05-01 00:00:00')
AS `delta`
FROM timeclock_punchlog AS `enter`
WHERE `enter`.`In-Out` = 1)
UNION
(SELECT `leave`.EmpID,
`leave`.PunchDateTime AS `time`,
DATE_FORMAT(`leave`.PunchDateTime, '%m-%d-%Y')
AS 'Punch Date',
-TIMESTAMPDIFF(SECOND,
`leave`.PunchDateTime,
'2003-05-01 00:00:00')
AS `delta`
FROM timeclock_punchlog AS `leave`
WHERE `leave`.`In-Out` = 0)) AS U
LEFT JOIN prempl pe ON u.EmpID = pe.prempl
WHERE DATE(U.`time`) >= "2015-10-05"
AND DATE(U.`time`) <= "2015-10-07"
AND U.EmpID = 0349
GROUP BY date(U.`time`), EmpID
ORDER BY U.EmpID, U.`time` ASC
这是一个SQL Fiddle,可以通过简单的查询重现问题。
insert into times values
('12:30 pm','12:00 pm'),
('12:00 pm','12:30 pm');
select time_format(timediff(start,end),'%h hrs, %i min.') from times
结果:
12 hrs, 30 min.
-12 hrs, 30 min.
这是一个使用datetime类型的sql小提琴并产生相同的结果。 http://sqlfiddle.com/#!9/9fb73/1
答案 0 :(得分:1)
问题在于格式化时间;看看差异是否为负,你会遇到这样的麻烦。
time_format
也有一些限制我建议阅读它上面的MySQL文档。
按照最后的通讯;我假设您使用的是datetime
数据类型,则以下查询将起作用。
CREATE TABLE `times` (
`PunchID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`breakout` datetime NOT NULL,
`breakin` datetime NOT NULL,
PRIMARY KEY (`PunchID`)
);
insert into `times`
values (1,'2015-10-06 12:00:00', '2015-10-06 12:30:00');
选择查询(请注意格式字符串h
的更改已更改为H
)
select time_format(timediff(breakin,breakout),'%H hrs, %i min.') from times;
一切正常。
如果您不确定哪个列可能比执行timediff
的其他列具有更高的价值并且格式化它可以给您奇怪的结果,在这种情况下更好地使用UNIX_TIMESTAMP()
并继续工作整数数学。
答案 1 :(得分:0)
您无法直接将类似'12:30 pm'
的时间字符串输入MySQL。始终会忽略am / pm
部分。尝试使用24h格式。