4

日付を「dd-mm-yyyy」形式の文字列として保存しています。今、私はこのような比較をしたい:

SELECT strftime('%d/%m/%Y', myDate) as myDate
FROM myTable
WHERE myDate>='01/07/2013' and myDate<='24/07/2013'

しかし、私は何も得ません。このクエリの何が問題になっていますか?

これは重複した質問ではありません。すべてを文字列として保存していましたが、DATE または DATETIME として保存していませんでした。日付形式の文字列を比較しようとしていました。したがって、反対票は公平ではありません。

4

2 に答える 2

8

現在のセットアップでクエリをそのように機能させる方法はありません。

日付を文字列として保存しているので、strftime を使用すると、必要なものを取得できると思います。それとも私が間違っていますか?

基本的に:あなたは間違っています!

ここでの問題は、そのようにフォーマットされた文字列は、希望どおりにソートできないことです。

具体的には:

myDate>='01/07/2013' and myDate<='24/07/2013'

ここでは、任意の年の任意の月の 1 日から 24 日までの任意の日付がこれに一致します。すなわち。これは「02/01/1900」と一致し、「02/12/2099」と一致します。

これは、文字列比較が数値 (または日付単位) ではなく英数字であるためです。「02」は「01」よりも大きく「24」よりも小さく、残りは冗長です。

日付を文字列としてフォーマットする「論理的な」方法は、最も重要な値から始めて、下に向かって作業することです。この形式は「yyyy/mm/dd」であり、その逆ではありませんが、日付を格納する実際の論理的な方法は、文字列ではなく日付として格納することです。

文字列を操作する唯一の方法は、各文字列を日付に変換して操作することですが、最善の方法はスキーマを修正することです。

現在のスキーマを絶対に変更できない場合は、これを機能させる方法がありますが、これはお勧めしません

where (substr(myDate, 7, 4) || '-' || substr(myDate, 4, 2) || '-' || substr(myDate, 1, 2)) between '2013-07-01' and '2013-07-24'

これにより、比較を行う前に、文字列が分解され、正しい順序で再びまとめられます。そこにある最後の 2 つの日付の形式にも注意してください。

于 2013-07-06T22:12:26.997 に答える
0

これを試しましたか:

SELECT strftime('%d/%m/%Y', myDate) as myDate
FROM myTable
WHERE myDate between date('01/07/2013') and date('24/07/2013');
于 2013-07-06T21:56:48.840 に答える