【问题标题】:MYSQL TIMEDIFF function not working for long dateMYSQL TIMEDIFF 函数不适用于长日期
【发布时间】:2011-04-15 12:58:43
【问题描述】:

Mysql Timediff 函数不适用于长日期。实际上我需要获取 date_time 字段与 now() 之间的时间差

所以我使用了这个查询

SELECT `date_time`,now(),timediff(`date_time`,now()) FROM `table_datetime`

我有两行

日期时间 2011-04-25 17:22:41 2011-06-14 17:22:52

我的结果是

这里第一行结果在变化,但第二行没有变化,这个总是返回

838:59:59

不断...为什么它没有给出正确的结果

感谢您的帮助!

【问题讨论】:

    标签: mysql datetime


    【解决方案1】:

    而不是TIMEDIFF 使用DATEDIFFEXTRACT

    SELECT DATEDIFF('2011-06-14 17:22:52', NOW()) * 24
    + EXTRACT(HOUR FROM '2011-06-14 17:22:52')
    - EXTRACT(HOUR FROM NOW())
    

    感谢 @rekaszeru 提供有用的链接

    替代解决方案(以秒为单位获取差异)

    SELECT TIMESTAMPDIFF(SECOND,NOW(),'2011-06-14 17:22:52');
    

    参考

    EXTRACT

    TIMESTAMPDIFF

    【讨论】:

    • 我如何在几秒钟内获得差异
    • +1 替代解决方案,工作非常好,非常简单,谢谢
    • hour('2011-06-14 17:22:52') - hour(now()) 可能更清楚
    【解决方案2】:

    你应该看看this issue,并在知道这些事情的情况下找到解决方案

    【讨论】:

    • 直接回答问题比链接到随时可能消失的外部文章要好得多。
    【解决方案3】:

    这个问题的另一种解决方案是编写一个用户定义的函数。请记住,返回值不再是时间对象而是字符串。所以在 MySQL 中你不能用它来做进一步的计算:

    DELIMITER $$
    
    DROP FUNCTION IF EXISTS `big_time_diff`$$
    
    CREATE DEFINER=`root`@`localhost` FUNCTION `big_timediff`(s_start VARCHAR(20), s_end VARCHAR(20)) RETURNS TEXT CHARSET latin1
    BEGIN
        DECLARE s_hour VARCHAR(20);
        DECLARE s_rest VARCHAR(20);
    
        SET s_hour = ABS(TIMESTAMPDIFF(HOUR, s_end, s_start));
        SET s_rest = TIME_FORMAT(TIMEDIFF(s_start, s_end), ':%i:%s');
    
        RETURN INSERT(s_rest, LOCATE('-', s_rest) + 1, 0, IF(LENGTH(s_hour) > 2, s_hour, LPAD(s_hour, 2, 0)));
    END$$
    
    DELIMITER ;
    

    【讨论】:

    • 谢谢! big_time_to_sec: DELIMITER $$ DROP FUNCTION IF EXISTS big_time_to_sec$$ CREATE DEFINER=root@localhost FUNCTION big_time_to_sec(big_time VARCHAR(20)) RETURNS INTEGER(11) BEGIN DECLARE s_hour_varchar VARCHAR(20);声明 s_hour_integer INTEGER(11);声明 s_seconds INTEGER(11); SET s_hour_varchar = REGEXP_SUBSTR(big_time, '[0-9]+'); SET s_hour_integer = CAST(s_hour_varchar AS INTEGER); SET s_seconds = s_hour_integer * 3600 + MINUTE(big_time) * 60 + SECOND(big_time);返回 s_seconds; END$$ 分隔符;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2019-04-15
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多