3

SQLite をローカル データベースとして使用する Windows 8 Metro アプリケーションに取り組んでいます。

データベース内のテーブルの 1 つに日時列が含まれています。結果セットを datetime 列で並べ替えるクエリを実行すると、予期しない結果が表示されます。結果セットが期待どおりに並べ替えられていません。

datetime 列には、C# の Metro アプリケーションによって生成されたデータが入力されます。たとえばDateTimeOffset.Now、WinRT は をサポートしていないためDateTime、 を使用していますDateTimeOffset

これを単純なテーブルで複製できます。

CREATE TABLE "Foo" ("DateOfFoo" DATETIME)

以下は、アプリケーションからのデータに基づくサンプル データです (UTC -7 である PDT タイムゾーンにいることに注意してください)。

INSERT INTO "main"."Foo" ("DateOfFoo") VALUES (?1)
Parameters:
param 1 (text): 9/18/2012 8:08:56 AM -07:00

INSERT INTO "main"."Foo" ("DateOfFoo") VALUES (?1)
Parameters:
param 1 (text): 9/18/2012 8:13:42 AM -07:00

INSERT INTO "main"."Foo" ("DateOfFoo") VALUES (?1)
Parameters:
param 1 (text): 9/18/2012 12:46:36 PM -07:00

次のような単純なクエリ:

Select * From Foo Order By DateOfFoo

次の結果セットを返します。

9/18/2012 12:46:36 PM -07:00
9/18/2012 8:08:56 AM -07:00
9/18/2012 8:13:42 AM -07:00

私が期待するとき:

9/18/2012 8:08:56 AM -07:00
9/18/2012 8:13:42 AM -07:00
9/18/2012 12:46:36 PM -07:00

そしてSelect * From Foo Order By DateOfFoo DESC戻ります:

9/18/2012 8:13:42 AM -07:00
9/18/2012 8:08:56 AM -07:00
9/18/2012 12:46:36 PM -07:00

私が期待するとき:

9/18/2012 12:46:36 PM -07:00
9/18/2012 8:13:42 AM -07:00
9/18/2012 8:08:56 AM -07:00

CDT タイムゾーンの同僚は、この問題を再現できませんでした。マシンのタイム ゾーンを CDT に変更し、アプリケーション データを入力したところ、クエリによって結果セットが正しく並べ替えられたことを確認できました。

9/18/2012 2:46:36 PM -05:00
9/18/2012 10:13:42 AM -05:00
9/18/2012 10:08:56 AM -05:00
4

2 に答える 2

3

SQLite は実際の日付/時刻データ型をサポートしていません。日付と時刻は文字列としてデータベースに挿入されるため、SELECTステートメントでアルファベット順にソートされます。SQLite はいくつかの日付と時刻の関数をサポートしていますが、使用している形式と一致しない形式のリストのいずれかに文字列が含まれている必要があります。適切な形式については、SQLite のドキュメントを参照してください。

于 2012-09-25T18:17:25.143 に答える