我有一个包含两个日期时间列的表(一个用于开始时间,一个用于结束时间)。
我需要能够选择所有条目并根据这两列之间的时差(开始和结束时间列之间的时间段)对它们进行排序
答案 0 :(得分:12)
试试这个::
select * from table order by TIMEDIFF(to, from)
答案 1 :(得分:2)
SELECT ...
FROM ...
ORDER BY DATEDIFF(endDate, starDate);
[编辑]
以上查询适用于日期。正如Sashi Kant所指出的那样,它会忽略DATETIME
另一方面,如果差异超出TIMEDIFF
范围(-838:59:59
到838:59:59
),则TIME
会失败。
完整的解决方案可能是:
SELECT ...
FROM ...
ORDER BY
DATEDIFF(endDate, starDate),
TIMEDIFF(TIME(endDate), TIME(starDate));
可能执行得非常糟糕,但是......如果需要这样的精度,并且如果两个日期之间的差异可能超出TIME
范围,那么将每个DATETIME
列拆分为两个假设您在四个结果列中的每一列上应用一个索引,DATE
和TIME
列肯定会表现得更好。
答案 2 :(得分:0)
SELECT something FROM table ORDER BY TIMEDIFF(end_date, start_date);
答案 3 :(得分:0)
有mysql
个已定义的函数来计算两个timestamp
之间的差异,例如TIME_TO_SEC
和TIMEDIFF
。
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()
函数始终返回两个时间戳之间的正“距离”时间测量值。这使我能够找到最近的可用记录,无论它早于还是晚于目标时间戳。