代码之家  ›  专栏  ›  技术社区  ›  Lloyd Banks

mysql-比较两个负时间值

  •  2
  • Lloyd Banks  · 技术社区  · 6 年前

    我的SQL查询中有以下条件语句:

    WHERE TIMEDIFF("03:00:00", VARIABLE) >= "00:05:00"
    

    以上工作按预期进行。如果返回的值来自 时间区分() 大于5分钟,将返回它所代表的记录。如果 时间区分() 收益率 -02:00:00 , -00:05:00 00:04:00 则该记录将被排除。如果它回来 00:06:00 01:02:00 ,相应的记录将包含在查询结果中。

    我需要将上述条件语句更新为:

    WHERE TIMEDIFF("03:00:00", VARIABLE) >= "-00:05:00"
    

    在更新的语句中,只有大于或等于的值 -00:05:00 应包括在结果中。我注意到情况并非如此。偶数条带有相应较大负值的记录 时间区分() - IE. -05:00:00 , 0:00 , -00:06:00 -将与此新的条件语句一起返回。

    MySQL似乎很难将两个负时间值进行比较。

    有没有办法准确地写下这个比较?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Zaynul Abadin Tuhin    6 年前

    使用 TIME_TO_SEC 将时间格式转换为整数秒,然后比较值

    像下面

    where TIME_TO_SEC(TIMEDIFF("03:00:00", VARIABLE))>=-300
    
        2
  •  0
  •   Maksym Fedorov    6 年前

    MySQL可以在以下范围内使用时间 -838:59:59 838:59:59 .

    首先,你要确保 TIMEDIFF() 返回正确的时间。例如, 时间区分() 使用时可能返回错误 jdbc driver 在负时间的情况下。 您可以使用简单查询来检查它:

    SELECT TIMEDIFF("02:55:00", "03:00:00")
    

    如果结果是“-05:00:00”,则驱动程序工作正常。

    其次,您应该手动在时间类型中转换时间值,因为MySQL可能会错误地将时间值转换为负值。

    WHERE TIMEDIFF("03:00:00", VARIABLE) >= TIME("-00:05:00")
    

    例如:

    SELECT TIMEDIFF("03:00:00", "3:00:00") >= "-00:05:00"; // return true
    SELECT TIMEDIFF("03:00:00", "3:10:00") >= "-00:05:00"; // return true
    

    此查询始终返回 true ,但如果手动将“-00:05:00”强制转换为时间类型,则此查询将返回正确的结果。

    SELECT TIMEDIFF("03:00:00", "3:00:00") >= TIME("-00:05:00"); // return true
    SELECT TIMEDIFF("03:00:00", "3:10:00") >= TIME("-00:05:00"); // return false
    
        3
  •  0
  •   Maksym Fedorov    6 年前

    嗯,你可以用 TIMESTAMPDIFF ( documentation ,为此,需要将硬编码值转换两次(如果直接将其强制转换为 datetime 时间戳 无法正常工作),如下所示:

    create table tbl (t time);
    insert into tbl values ("00:06:00"), ("00:03:00"), ("-00:06:00"), ("-00:03:00");
    -- here you can see how it works
    select *,
           TIMESTAMPDIFF(SECOND, cast(cast("00:05:00" as time) as datetime), cast(t as datetime))
    from tbl;
    

    上面提到的函数将返回一个整数,很容易与之进行比较:)

    推荐文章