2つの日時列(1つは開始時刻用、もう1つは終了時刻用)を持つテーブルがあります。
すべてのエントリを選択し、これら2つの列の時間差(開始時間列と終了時間列の間の期間)に基づいて並べ替えることができる必要があります
2つの日時列(1つは開始時刻用、もう1つは終了時刻用)を持つテーブルがあります。
すべてのエントリを選択し、これら2つの列の時間差(開始時間列と終了時間列の間の期間)に基づいて並べ替えることができる必要があります
これを試して::
select * from table order by TIMEDIFF(to, from)
SELECT ...
FROM ...
ORDER BY DATEDIFF(endDate, starDate);
[編集]上記のクエリは日付で機能します。サシカントが指摘したように、それはあなたの時間の部分を無視するでしょうDATETIME
一方、差が範囲(〜 )TIMEDIFF
外の場合は失敗します。TIME
-838:59:59
838:59:59
完全な解決策は次のとおりです。
SELECT ...
FROM ...
ORDER BY
DATEDIFF(endDate, starDate),
TIMEDIFF(TIME(endDate), TIME(starDate));
ただし、おそらくひどいパフォーマンスです...そのような精度が必要で、2つの日付の差が範囲外である可能性がある場合は、 1つのインデックスを適用すると仮定すると、各列を2つTIME
に分割して列を実行すると確実にパフォーマンスが向上します。結果の4つの列のそれぞれに。DATETIME
DATE
TIME
SELECT something FROM table ORDER BY TIMEDIFF(end_date, start_date);
とのように、 2つのsのmysql
差を計算する関数が定義されています。timestamp
TIME_TO_SEC
TIMEDIFF
SELECT TIME_TO_SEC(TIMEDIFF(from_time, to_time)) diff from your_table order by diff;
これは正しいです:TIMEDIFF(to、from)によるテーブル順序から*を選択してください
ただし、selectステートメントでtimediffを選択していない場合は、次のコード行を追加する必要があります。
SET sql_mode ='';
select * from table order by TIMEDIFF(to、from)
ONLY_FULL_GROUP_BYモードを無効にするには
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つのタイムスタンプ間の時間の正の「距離」測定値を返します。これにより、ターゲットのタイムスタンプよりも前か後かを問わず、利用可能な最も近いレコードを見つけることができました。