MySQL函数在时差计算中达到极限

时间:2013-12-12 22:21:23

标签: mysql datetime

我使用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小时左右。

2 个答案:

答案 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 ;