5

2つの日時列(1つは開始時刻用、もう1つは終了時刻用)を持つテーブルがあります。

すべてのエントリを選択し、これら2つの列の時間差(開始時間列と終了時間列の間の期間)に基づいて並べ替えることができる必要があります

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);

[編集]上記のクエリは日付で機能します。サシカントが指摘したように、それはあなたの時間の部分を無視するでしょうDATETIME

一方、差が範囲(〜 )TIMEDIFF外の場合は失敗します。TIME-838:59:59838:59:59

完全な解決策は次のとおりです。

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

ただし、おそらくひどいパフォーマンスです...そのような精度が必要で、2つの日付の差が範囲外である可能性がある場合は、 1つのインデックスを適用すると仮定すると、各列を2つTIMEに分割して列を実行すると確実にパフォーマンスが向上します。結果の4つの列のそれぞれに。DATETIMEDATETIME

于 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

とのように、 2つのsのmysql差を計算する関数が定義されています。timestampTIME_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

これは正しいです:TIMEDIFF(to、from)によるテーブル順序から*を選択してください

ただし、selectステートメントでtimediffを選択していない場合は、次のコード行を追加する必要があります。

SET sql_mode ='';

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

ONLY_FULL_GROUP_BYモードを無効にするには

于 2019-12-09T04:31:48.603 に答える
0

2つのタイムスタンプ間の時間距離が必要な場合は、どちらの日付が早いか、どちらの日付が遅いかを知らなくても、次のように使用できます。

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()関数は、常に2つのタイムスタンプ間の時間の正の「距離」測定値を返します。これにより、ターゲットのタイムスタンプよりも前か後かを問わず、利用可能な最も近いレコードを見つけることができました。

于 2021-05-01T03:06:05.380 に答える