0

SOにはすでにいくつかの質問があることは知っていますが、正しい答えが見つかりません。

私は次のような形式の日付で注文しようとしています:01-01-1999。私のクエリは次のようになります。

SELECT id, header, date FROM table ORDER BY date DESC

私は4行を取得していますが、これは問題ないようです(同じです)が、さらに奇妙な結果が得られます。

フィールドはVARCHAR();です。--1999年1月1日の形式を保存するフィールドは何ですか?

奇妙な結果は、私が4x30-08-2012を取得していることです。そして、多くの古い日付がありますが、突然、13-09-2012の2つのレコードがあります。

私の質問は:どうしてそれらをソートしないのですか:2x13-09-2012そして4x30-08-2012そしてそれからさらに。

アップデート

問題は解決しました。しかし、それでも:VARCHARの代わりに日付に使用するデータフィールドは何ですか?

4

3 に答える 3

5

juergen は、基本的に毎回解析される日付を含む回答を提供しました。ただし、他の2つの代替案が提案されています。

  • データベース スキーマを変更して、列が文字列ではなく日付型(例: ) になるようにします。DATEデータベースの列が、格納したいデータの種類を正確に表すようにすると、多くの場合、生活がずっと良くなります。

  • 本当にデータを文字列列に格納する必要がある場合は、形式を yyyy-MM-dd に変更することを検討してください。これは、「アルファベット順」の順序が日付の「意味論的」順序と互換性があるという点で、自然にソート可能な形式です。

最初のオプションは間違いなく望ましい IMO です。これは、順序付けをはるかに超えて、次のようになります。

  • 検証 (うまくいけば、My​​SQL は個人的に好きなよりも無効なデータに対して寛容であると思いますが...)
  • 変換: PHP のサポートがどのようなものかはわかりませんが、一般的には、データベースとの間で日付/時刻の値を文字列に変換せずに送受信できるはずです。これにより、エラーが発生しやすい変換が削除されます。
  • 目的の明確化: データベースを調査しているすべての人に、可能な限り多くの支援をお願いします。データについて知っていることは何でも、スキーマに入れます。テキスト、数値、または日付/時刻データであるかどうかに関係なく、すべてを varchar として保存する場合は、「まあ、それは単なるものです」と言うかもしれませ
于 2012-08-19T18:11:55.260 に答える
4

試す

SELECT id, header, date FROM table
ORDER BY str_to_date(date, '%d-%m-%Y') DESC

STR_TO_DATEを参照

于 2012-08-19T18:09:20.460 に答える
0

日付を文字列に格納する最良の方法は、'YYYY-MM-DD' です。MySQL には、日付のネイティブ形式 - DATETIMEがあります。

于 2012-08-19T18:14:10.797 に答える