2017-08-30 19 views
0

私はPythonでSQLiteを使用しています。私は2つのフィールド(タイムスタンプ、読み込み)を持つデータベースを持っています。比較結果より大きいSQLiteは等しい値も返します。

タイムスタンプは、 "YYYY-MM-DD HH:MM:SS.SSSSSS"のようにフォーマットされたISO8601文字列です。

私は、このSQLクエリを実行する場合:私は、タイムスタンプは日付が設けられているので、私はまた、例の私が渡し日時からの読み出しを(得るすべての適切な測定値を得る

SELECT timestamp, value FROM 'readings' WHERE timestamp > datetime('2017-08-30 14:19:28.684314') 

を ' 2017-08-30 14:19:28.684314 ')。

私の質問は、比較演算子がそれ以上の演算子であると思っているのはなぜですか?

+0

実際に_DB_システムのエキスパートではなく_SQLite_のエキスパートですが、* micro * sは6桁に丸められているか、日付を含む変換があります数時間/分のローカリゼーション(加算/減算)。 – CristiFati

+0

私はそれについて考えていましたが、システムが同じ入力日時を同じように丸めると仮定したので、私はそれを却下しました。これは、理論的には、丸めをしても入力値を有効な応答として返さないことを意味します。 – badrobit

答えて

0

私はこの問題を解決します。それが他の人にとって参考になる場合は、ここで詳しく説明します。

これは私の質問です。 SQLiteには、日付型または日時型の直接型はありません。

私の古いクエリ:

SELECT timestamp, value FROM 'readings' WHERE timestamp > datetime('2017-08-30 14:19:28.684314') 

は、暗黙的にタイムスタンプフィールドが日付時刻だったことを把握するSQLに頼りました。 SQLiteはそれらをTEXTフィールドとして内部的に保存します。

私は次のように私のクエリを変更する場合:

SELECT timestamp, value FROM 'readings' WHERE datetime(timestamp) > datetime('2017-08-30 14:19:28.684314') 

私は私が期待していた結果を得るために始めました。

1

SQLiteにはタイムスタンプ用のデータ型がありません。

datetime()戻ったSQLiteのデフォルトフォーマットの単なる文字列は:

> select datetime('2017-08-30 14:19:28.684314'); 
2017-08-30 14:19:28 

これは、ミリ秒は含まれていません。したがって、比較はミリ秒の文字列とミリ秒のない文字列との間で終了します。 (最初の19文字が等しくなった後に)より多くの文字があるため、最初の文字は大きくなります。

両方の値にdatetime()を呼び出すと、両方の値からミリ秒が削除されます。 どちらの値にもdatetime()を呼び出して直接比較することをお勧めします。

関連する問題