我使用phpmyadmin为mysql创建了一个函数(工作正常)。它以天,小时,分钟和秒计算两个日期之间的差异。输出可以是这样的:
5d 16h 24m 56s
上述功能:
CREATE FUNCTION time_full(A DATETIME, B DATETIME) RETURNS VARCHAR(30)
BEGIN
RETURN CONCAT(FLOOR(HOUR(TIMEDIFF(A,B))/24),'d '
,MOD(HOUR(TIMEDIFF(A,B)),24), 'h '
,MINUTE(TIMEDIFF(A,B)),'m '
,SECOND(TIMEDIFF(A, B)),'s');
END
所以在创建它并检查工作正常之后,我决定让它计算两个日期之间的大的时间间隔,比如2个月左右,但它可以计算的最大差距是:
34d 22h 59m 59s
任何人都知道为什么? (这是个大问题)
我知道自查询函数以来发生了一些事情:
SEC_TO_TIME(TIMESTAMPDIFF(SECOND, created, sol_provided)) AS timeDiff
我遇到了麻烦,因为它可以计算的小时数差距大约是848小时左右。
答案 0 :(得分:1)
来自MySQL网站(http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timediff)
The result returned by TIMEDIFF() is limited to the range allowed for TIME values
然后,如果您继续关于TIME的部分,(http://dev.mysql.com/doc/refman/5.5/en/time.html)
TIME values may range from '-838:59:59' to '838:59:59'. The hours part may be so large because the TIME type can be used not only to represent a time of day (which must be less than 24 hours), but also elapsed time or a time interval between two events (which may be much greater than 24 hours, or even negative).
答案 1 :(得分:0)
好的,我找到了答案。事实证明,TIMEDIFF(a,b)返回一个TIME类型的值(在文档中不起作用,但是如果你执行它就可以看到它)。
TIMEDIFF()返回表达为时间值的expr1 - expr2。 expr1和 expr2是时间或日期和时间表达式,但两者都必须是 同类型。
关于我发现的限制:
TIME值的范围可以从'-838:59:59'到'838:59:59'。
因此,如果我们想要计算大于838小时的差距,我们需要解决方案,这可能是以下一个:
# Number of days * 24 + time difference.
SELECT
DATEDIFF('2010-01-01 00:00:00', '2009-01-01 00:00:00') * 24
+ EXTRACT(HOUR FROM '2010-01-01 00:00:00')
- EXTRACT(HOUR FROM '2009-01-01 00:00:00')
我的第一个功能的另一个解决方案是下面的一个很容易超越限制:
DELIMITER //
CREATE FUNCTION time_full(A DATETIME, B DATETIME) RETURNS VARCHAR(30)
BEGIN
RETURN CONCAT(TIMESTAMPDIFF(day,A,B),'d ',
MOD(TIMESTAMPDIFF(hour,A,B), 24),'h ',
MOD(TIMESTAMPDIFF(minute,A,B), 60),'m '
MOD(TIMESTAMPDIFF(second,A,B), 60),'s ');
END//
DELIMITER ;