5

AM / PM による並べ替えの問題に直面しています。

ここに私のテーブルデータがあります

login_time
1:30 PM
2:00 AM
8:00 AM
9:30 PM
10:00 PM
11:10 AM

私は結果が欲しい:

login_time
2:00 AM
8:00 AM
11:10 AM
1:30 PM
9:30 PM
10:00 PM

これどうやってするの?

4

4 に答える 4

5

すでに日付を として持っている場合はVARCHAR、それを列にリファクタリングすることをお勧めしTIMEます。これはオンラインで簡単に実行できます。

UPDATE tablename SET login_time = STR_TO_DATE(login_time, '%l:%i %p');
ALTER TABLE tablename CHANGE login_time login_time TIME;

データには明らかにtimeのみが含まれTIMEているため、ここではタイプを使用します。たぶん、タイプが最も適切でしょう。さまざまなオプションについては、http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.htmlを参照してください。DATETIME

とにかく、列が適切な型にリファクタリングされたら、次のように記述できます。

SELECT
  login_time
FROM
  tablename
ORDER BY
  login_time

検索/並べ替えを高速化するためにインデックスを構築できるという追加の利点があります。login_time

ALTER TABLE tablename ADD INDEX ( login_time );

http://sqlfiddle.com/#!2/03991/1を参照してください([実行計画の表示] をクリックして、実際のインデックスが使用されていることを確認してください)。

于 2013-08-07T18:24:20.723 に答える
1

言及されたコメントのように、可能であれば、列のデータ型を変更してください。これが変換された値による制御順序から外れている場合:

select login_time from table order by CAST(login_time as datetime)
于 2013-08-07T17:51:28.730 に答える