SQLite 对使用 DateTimeOffset 从 C# 填充的日期时间列进行排序

Geo*_*rzi 5 sqlite microsoft-metro

我正在开发一个使用 SQLite 作为本地数据库的 Windows 8 Metro 应用程序。

数据库中的一个表包含日期时间列。在运行按日期时间列对结果集进行排序的查询时,我看到了意外的结果 - 结果集的排序方式与您预期的不同。

日期时间列填充了由 C# 中的 Metro 应用程序生成的数据;例如作为DateTimeOffset.Now. WinRT 不支持DateTime,因此我们使用DateTimeOffset.

您可以在一个简单的表中复制它:

CREATE TABLE "Foo" ("DateOfFoo" DATETIME)
Run Code Online (Sandbox Code Playgroud)

以下是一些基于我们应用程序数据的示例数据(请注意,我位于 PDT 时区,即 UTC -7):

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
Run Code Online (Sandbox Code Playgroud)

一个简单的查询,例如:

Select * From Foo Order By DateOfFoo
Run Code Online (Sandbox Code Playgroud)

返回以下结果集:

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
Run Code Online (Sandbox Code Playgroud)

当我期望:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

当我期望:

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
Run Code Online (Sandbox Code Playgroud)

我在 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
Run Code Online (Sandbox Code Playgroud)

gli*_*dud 3

SQLite 不支持实际的日期/时间数据类型。日期和时间作为字符串插入到数据库中,因此在SELECT语句上按字母顺序排序。SQLite 确实支持一些日期和时间函数,但要求字符串采用格式列表之一,而您使用的格式与这些格式不匹配。有关正确的格式,请参阅SQLite 文档