1

mysql datebaseに保存されている日付をVARCHARとして変換しようとしています(フォーマット例:2012年12月29日)。次に、古い日付の後に現在の日付が続くようにORDERBYします。

Eg: 
11-01-2012
11-05-2012
12-25-2012
...

これが私がこれまでに持っているものです(助けてください!!ありがとう)

<?php
        $listsql = "SELECT contact.id, CONCAT(lastname,', ',firstname) AS fullname, lastname, firstname,
                    STR_TO_DATE(daDATE,'%m-%d-%Y'), line1, line2, city, state, zip, phone1, phone2, country, whoAdded
                    FROM ". TABLE_CONTACT ." AS contact
                    LEFT JOIN ". TABLE_ADDRESS. " AS address ON contact.id=address.id AND contact.primaryAddType=address.type
                    LEFT JOIN ". TABLE_EMAIL ." AS email ON contact.id=email.id AND contact.primaryAddType=email.type
                    WHERE contact.hidden != 1
                    ORDER BY email.daDATE";
?>
4

2 に答える 2

2

コメントがあなたに示したように。本当にフィールドタイプをdateまたはに変更datetimeする必要があります(HMS情報が必要な場合)。テキストタイプフィールドの日付値に対して文字列操作を行うことはできますが、インデックスを使用して、そのフィールドで実行したいフィルタリング/並べ替え/グループ化を効率的に行う方法はありません。

変換のサポートが必要な場合は、このアプローチをお勧めします。新しい日付または日時の列を追加します。この列は注文に使用するため、必ずこの列にインデックスを追加してください。

次に、次のクエリを実行します。

UPDATE table SET new_date_column = STR_TO_DATE(old_date_column, '%m-%d-%Y');

次に、テーブルから古い列を削除します。

于 2012-11-28T19:59:50.970 に答える
0

SUBSTR()を使用してオンザフライでINSTR()注文し、日付の各部分を識別してから、年、月、日の部分で注文できます。他のみんなが言ったように、それをdateまたはunixtime整数として保存する方が良いです。これをに変更するyyyy-mm-ddと、orderbyがネイティブに機能します。

可能な限り最も難しい方法を主張する場合、それは(年、月、日)のようになります。

ORDER BY SUBSTR(email.daDATE,INSTR(email.daDATE,'-',2)+1) DESC,
         SUBSTR(email.daDATE,INSTR(email.daDATE,'-',1)+1,INSTR(email.daDATE,'-',2)-1) DESC,
         SUBSTR(email.daDATE,0,INSTR(email.daDATE,'-')-1) DESC

またはそのようなもの。これは私の頭のてっぺんからその場でしたが、それは正確だと思います。意図したとおりに機能しない場合は、関数の使用法を調べてください。

于 2012-11-28T20:16:27.197 に答える