この形式のDD-MM-YYYYで、日付を文字列としてデータベースに保存しています。
日付列にオーダーバイを使用して選択クエリを作成しようとしたとき。期待した結果が得られませんでした。
結果の例: 28/02/2013 27/02/2013 01/03/2013
私のSQLクエリ:
SELECT * FROM data ORDER BY strftime('%s', date_column)
ありがとうございました。
問題は、日付をDD-MM-YYYY文字列として保存することです。これにより、日付を文字列として自然に並べ替えるだけでなく、SQLiteの日付と時刻の関数で日付を解析することもできなくなります。リンクをクリックして、[時間文字列]セクションまで下にスクロールします。
SQLiteは、日付/時刻文字列を自然な順序で、最上位桁から最下位桁、つまりYYYY-MM-DDであると想定しています。文字列操作を使用して、DD-MM-YYYY文字列をその形式に変換できます。例えば:
select
substr(reversed_date, 7,4) || '-' ||
substr(reversed_date, 4, 2)|| '-' ||
substr(reversed_date, 1, 2) as proper_date
from (
select '12-03-2000' as reversed_date
)
;
日付列をこの形式に変換するか(@petermが示唆するように)、の値を使用しproper_date
て並べ替えることができます。そのために使用する必要はありませんがstrftime
、日付関連の関数はそのような値で機能します。
私見あなたはあなたが日付を保存するフォーマットを変更する必要があります
DD-MM-YYYY
に
YYYY-MM-DD
ドキュメントから
時間 文字列時間文字列は、次のいずれかの形式にすることができます
。YYYY-MM-DD
YYYY-MM-DD HH:MM
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS.SSS
YYYY -MM-DDTHH:MM
YYYY-MM-DDTHH:MM:SS
YYYY-MM-DDTHH:MM:SS.SSS
..。
次に、元のクエリとこれが期待どおりに機能します
SELECT * FROM Table1 ORDER BY date(date_column);
SELECT * FROM Table1 ORDER BY strftime('%s', date_column);
出力:
| date_column |
---------------
| 2013-02-27 |
| 2013-02-28 |
| 2013-03-01 |
ドキュメントによると、次のように動作するはずです
SELECT *
FROM data
ORDER BY strftime('%Y-%m-%d', date_column)
試す:
SELECT * FROM data ORDER BY to_date(date_column)
日付比較ではなく文字列比較を行うため、おそらくこれで問題が解決する可能性があります。
2013 年 1 月 3 日は、2013 年 2 月 28 日または 2013 年 2 月 27 日よりも小さく表示されます
したがって、出力は次のとおりです。
2013 年 3 月 1 日、2013 年 2 月 27 日、2013 年 2 月 28 日