2011-06-19 10 views
0

各項目は私が日付を挿入するには、以下の方法を使用し、DBに入力されています時間単位でソートする適切な方法は何ですか?

date_default_timezone_set('America/New_York'); 
ob_start(); 
$createdon = date('l, F j, Y, h:i A'); 
ob_get_clean(); 

このようなものを出力:

select test_id, why_test, date_time 
    from the_test 
    where p_id = '$id' 
    UNION 
    select pencil_id, pencil_name, date_time 
    from pencils 
    where p_id = '$id' 
    ORDER BY 3 DESC 

Tuesday, May 3, 2011, 04:50 PM 

これはクエリですさて、私は関数を使って注文すると、正しく機能しません。日付はまだ混ざっています。 date_time DESCで注文しました。

私はphp/phpmyadminを使用しています。

アイデア?

+0

あなたのテーブル構造は何ですか? 'SHOW CREATE TABLE tbl_name'を実行し、日付をTIMESTAMPまたはDATETIMEフィールドとして保存していることを確認してください。 – JamesHalsall

+0

これを変換すると、すべての日付が失われます。 – AAA

+0

これは、PHPが理解できない形式で日付を文字列として保存しているためです。 PHPの標準日付/時刻文字列形式は 'YYYY-MM-DD HH:MM:SS'です。あなたの 'date_time'フィールドは文字列なので、PHPはその内容を文字列としてソートしています。これは12月が前に来ることを意味します。 –

答えて

6

日付を文字列として格納するのは間違っています。日付は日付として保存する必要があります。

MySQLには、日付と時刻に関する適切な種類の選択肢があります。 TIMESTAMPまたはDATETIMEのいずれかをお勧めします(おそらく後者です;あなたのために何が最善のものかを調べるにはマニュアルで調べてください)。あなたのテーブル構造を修正する際に、既存のデータの損失を防ぐため

  • 右のタイプのフィールドを追加します。
  • UNIX_TIMESTAMPファンクション—を使用して、新しいフィールドにデータをコピーするようにテーブルの各行を更新します。これは1回限りのコピーであり、時間がかかることがあります。
  • 古いフィールドを削除し、代わりに新しいフィールドを使用し始めます。

ORDER BYは、このフィールドでは自然に動作します。使用するようにMySQLが使用されるようになります。

+1

'TIMESTAMP'は現在のタイムゾーンを考慮に入れ、接続タイムゾーンが異なる場合、自動的にサーバーのタイムゾーンに変換することができます。 'DATETIME'はタイムゾーンとの関係を維持しません。 – datasage

2

がここ

SELECT .... ORDER BY UNIX_TIMESTAMP(`date_time`) DESC 

アイデアを試し、ソートすることができる数に文字列を有効にすることです。あなたがそれに精通していないなら、unixタイムスタンプは、1970年1月1日以来の秒数なので、時間をそれに変換することができれば、線形で簡単に時間を比較することができます。

が、私は、MySQLのUNIX_TIMESTAMP()は、形式の文字列が必要です信じる:1970-01-01 00:00:00

をしかし概念がUNIXタイムスタンプまたはdatetimeまたはtimestamp

などのMySQLのネイティブ日付型として日付を回し(あるいはそれを格納)に、残っています
+0

@hexaありがとう!それはうまくいきましたが、DESCを試してみるとデフォルトではASCだけしか実行しません。 – AAA

+0

'date'の代わりに 'date'を使用すると、古い問題に戻りました。 – AAA

+0

@hexa:何が恐ろしく非効率なことですか? –

関連する問題