按日期排序两个日期列之间的差异

时间:2012-06-19 10:52:19

标签: mysql

我有一个包含两个日期时间列的表(一个用于开始时间,一个用于结束时间)。

我需要能够选择所有条目并根据这两列之间的时差(开始和结束时间列之间的时间段)对它们进行排序

6 个答案:

答案 0 :(得分:12)

试试这个::

select * from table order by TIMEDIFF(to, from)

答案 1 :(得分:2)

SELECT ...
FROM ...
ORDER BY DATEDIFF(endDate, starDate);

[编辑] 以上查询适用于日期。正如Sashi Kant所指出的那样,它会忽略DATETIME

time 部分

另一方面,如果差异超出TIMEDIFF范围(-838:59:59838:59:59),则TIME会失败。

完整的解决方案可能是:

SELECT ...
FROM ...
ORDER BY
    DATEDIFF(endDate, starDate),
    TIMEDIFF(TIME(endDate), TIME(starDate));

可能执行得非常糟糕,但是......如果需要这样的精度,并且如果两个日期之间的差异可能超出TIME范围,那么将每个DATETIME列拆分为两个假设您在四个结果列中的每一列上应用一个索引,DATETIME列肯定会表现得更好。

答案 2 :(得分:0)

SELECT something FROM table ORDER BY TIMEDIFF(end_date, start_date);

答案 3 :(得分:0)

mysql个已定义的函数来计算两个timestamp之间的差异,例如TIME_TO_SECTIMEDIFF

SELECT TIME_TO_SEC(TIMEDIFF(from_time, to_time)) diff from your_table order by diff;

答案 4 :(得分:0)

这是正确的:通过TIMEDIFF(to,from)从表顺序中选择*

但是,如果您未在select语句中选择timediff,则可能必须添加以下代码行:

SET sql_mode ='';

从表顺序中按TIMEDIFF(to,from)选择*

禁用ONLY_FULL_GROUP_BY模式

答案 5 :(得分:0)

对于只需要两个时间戳之间的时间距离的任何人,无论或不必知道哪个日期早哪个日期晚,您可以使用以下内容:

SELECT t.*,
TIMEDIFF( t.date_column, t.other_date_column ) AS distance
FROM table t
ORDER BY IF(distance<0, 0-distance, distance)

或者如果您有固定/静态目标时间戳:

SELECT t.*,
TIMEDIFF( t.date_column, '2021-04-20' ) AS distance
FROM table t
ORDER BY IF(distance<0, 0-distance, distance)

IF() 函数始终返回两个时间戳之间的正“距离”时间测量值。这使我能够找到最近的可用记录,无论它早于还是晚于目标时间戳。