5

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

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

4

6 回答 6

13

尝试这个::

select * from table order by TIMEDIFF(to, from)
于 2012-06-19T10:55:45.337 回答
2
SELECT ...
FROM ...
ORDER BY DATEDIFF(endDate, starDate);

[编辑] 上述查询适用于dates。正如 Sashi Kant 所指出的,它会忽略你的时间部分DATETIME

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

一个完整的解决方案可能是:

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

不过可能性能很差......如果需要这样的精度,并且如果两个日期之间的差异可能超出TIME范围,那么假设您将应用一个索引,那么将您的每一DATETIME列分成两列DATETIME列肯定会表现得更好在四个结果列中的每一个上。

于 2012-06-19T10:55:42.053 回答
0
SELECT something FROM table ORDER BY TIMEDIFF(end_date, start_date);
于 2012-06-19T10:57:26.487 回答
0

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

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

于 2012-06-19T10:57:39.873 回答
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()函数始终返回两个时间戳之间时间的正“距离”测量值。这使我能够找到最近的可用记录,无论它早于还是晚于目标时间戳。

于 2021-05-01T03:06:05.380 回答
0

这是正确的: select * from table order by TIMEDIFF(to, from)

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

设置 sql_mode = '';

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

禁用 ONLY_FULL_GROUP_BY 模式

于 2019-12-09T04:31:48.603 回答