1

私のデータベースが「data」と呼ばれ、その2番目の列が「datetime」と呼ばれているとしましょう。私の日時の形式は「2011年7月22日12:00:00」です。今日の12:00から13:00までの情報を取得したい場合、どうすればよいですか?

SELECT * FROM data WHERE 
strftime('%m/%d/%Y %H:%M:%S', datetime) > strftime('%m/%d/%Y %H:%M:%S', '7/22/2011 12:00:00') 
AND 
strftime('%m/%d/%Y %H:%M:%S', datetime) < strftime('%m/%d/%Y %H:%M:%S', '7/22/2011 13:00:00')

トリックをしません。

4

2 に答える 2

2

私はこれを間違えました-私に恥をかかせます。strftimeISO 8601(またはタイムスタンプ/ジュリアン)値のみを読み取ります。指定された形式は入力には適用されません。出力値にのみ適用されます。

このため、データベースのデータは、並べ替えるのに自然な順序である必要があります。推奨される形式は、ISO 8601(文字列)、タイムスタンプ(整数)、およびユリウス日(浮動小数点)です。m/d/yデータベースのように日付を使用すると、自然順序に準拠できないため、範囲比較では機能しません。

strftime友人は、比較に役立つ値の1つを生成することを許可します。たとえば、ISO 8601 / timestamp/julian入力からcustom/ISO 8601 / timestamp/julian-dateに変換できます。ただし、カスタム値から直接変換することはできません。

データベースを修正する最も簡単な方法は、おそらくPythonなどの言語を使用して、既存のデータを変換するためのスクリプトを作成することです。SimpleDateFormatを利用して既存の値を解析し、推奨されるタイプの1つを使用してそれらを書き戻す小さなJavaプログラムを作成することもできます。


歴史的:

コンソールから分割して試してください(これにより、クエリをより速く実験できるようになります)-最初の条件付き、次に2番目の条件付き。何が何を、そしてなぜ返すのか?各ピースが機能したら、それらを一緒に配置すると機能します。

複数のstrftime形式の間違いがあります-形式については日付と時刻を参照し、文字列をもう一度確認してください:)また、saner日付形式(ISO 8601)を使用datetimeしている場合は、形式を明示的に指定することを気にせずに使用できます。ISO 8601の値は、文字列として字句的に並べ替えることもできます。これには、追加の利点があります。

Java SQLite adatperがパラメータとしてパラメータ化されたクエリに渡されたときにDateをどのように処理するかはわかりません(パラメータ化されたクエリを実際に使用する必要があります)...しかし、いずれにせよ、これは現在観察されている動作の二次的な問題です。

ハッピーコーディング。

于 2011-07-22T20:48:40.620 に答える
0

悪いフォーマットの文字を持っているように見えます

SELECT * FROM data WHERE 
strftime('%m/%d/%Y %H:%H:%S', datetime) > strftime('%m/%d/%y %H:%M:%S', '7/22/2011 12:00:00') 
--                     ^ 
AND 
strftime('%m/%d/%y %H:%M:%S', datetime) < strftime('%m/%d/%y %H:%M:%S', '7/22/2011 13:00:00')
于 2011-07-22T20:56:55.283 に答える