用DateTimeOffset从C填充的datetime列上的SQLite排序顺序

用DateTimeOffset从C填充的datetime列上的SQLite排序顺序,sqlite,microsoft-metro,Sqlite,Microsoft Metro,我正在开发一个Windows8Metro应用程序,它使用SQLite作为本地数据库 数据库中的一个表包含datetime列。当运行按datetime列对resultset进行排序的查询时,我看到了意外的结果-resultset的顺序与您预期的不同 datetime列由Metro应用程序在C中生成的数据填充;例如,DateTimeOffset.Now。WinRT不支持DateTime,因此我们使用DateTimeOffset 您可以在一个简单的表中复制这一点: CREATE TABLE "Foo"

我正在开发一个Windows8Metro应用程序,它使用SQLite作为本地数据库

数据库中的一个表包含datetime列。当运行按datetime列对resultset进行排序的查询时,我看到了意外的结果-resultset的顺序与您预期的不同

datetime列由Metro应用程序在C中生成的数据填充;例如,DateTimeOffset.Now。WinRT不支持DateTime,因此我们使用DateTimeOffset

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

CREATE TABLE "Foo" ("DateOfFoo" DATETIME)
以下是一些基于我们应用程序数据的示例数据注意,我在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
一个简单的查询,例如:

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
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
并从Foo Order By DATEOFF中选择*Foo DESC returns:

当我期望:

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
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

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

SQLite将日期/时间存储为字符串。假设使用标准格式将值输入到日期/时间字段中,您可以将orderby与自定义IComparer一起使用:


谢谢格利布杜德。我们将通过在客户端排序来解决这个问题,而不是对SQLite进行查询。在我们的例子中,是一个C LINQ查询。获取数据后,我们将在C中应用OrderBy。
var res = (new MyDbContext()).MyData.OrderBy(v => v.TimeField, new SqliteDateComparer());