我有一个包含两个日期时间列的表(一个用于开始时间,一个用于结束时间)。
我需要能够选择所有条目并根据这两列之间的时间差(开始时间列和结束时间列之间的时间段)对它们进行排序
尝试这个::
select * from table order by TIMEDIFF(to, from)
SELECT ...
FROM ...
ORDER BY DATEDIFF(endDate, starDate);
[编辑] 上述查询适用于dates。正如 Sashi Kant 所指出的,它会忽略你的时间部分DATETIME
另一方面,TIMEDIFF
如果差异超出TIME
范围 ( -838:59:59
to 838:59:59
),则失败。
一个完整的解决方案可能是:
SELECT ...
FROM ...
ORDER BY
DATEDIFF(endDate, starDate),
TIMEDIFF(TIME(endDate), TIME(starDate));
不过可能性能很差......如果需要这样的精度,并且如果两个日期之间的差异可能超出TIME
范围,那么假设您将应用一个索引,那么将您的每一DATETIME
列分成两列DATE
和TIME
列肯定会表现得更好在四个结果列中的每一个上。
SELECT something FROM table ORDER BY TIMEDIFF(end_date, start_date);
有mysql
定义的函数来计算两个 s 之间的差异timestamp
,比如TIME_TO_SEC
和TIMEDIFF
。
SELECT TIME_TO_SEC(TIMEDIFF(from_time, to_time)) diff from your_table order by diff;
对于只需要两个时间戳之间的时间距离的任何人,无论或不必知道哪个日期更早,哪个日期更晚,您可以使用以下内容:
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()
函数始终返回两个时间戳之间时间的正“距离”测量值。这使我能够找到最近的可用记录,无论它早于还是晚于目标时间戳。
这是正确的: select * from table order by TIMEDIFF(to, from)
但是,如果您没有在 select 语句中选择 timediff,则可能必须添加这行代码:
设置 sql_mode = '';
select * from table order by TIMEDIFF(to, from)
禁用 ONLY_FULL_GROUP_BY 模式