3

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

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

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

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 回答
1

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

public class SqliteDateComparer : IComparer<string> {
  public int Compare(string s1, string s2) => DateTime.Compare(DateTime.Parse(s1), DateTime.Parse(s2));
}

然后即:

var res = (new MyDbContext()).MyData.OrderBy(v => v.TimeField, new SqliteDateComparer());
于 2018-11-27T05:35:26.337 回答