0

我正在查询具有 DateTime 成员的 SQLite 表:

public class PhotraxBaseData
{
    [SQLite.PrimaryKey] 
    [SQLite.AutoIncrement]
    public int Id { get; set; }
    . . .
    public DateTime dateTimeTaken { get; set; }
    . . .

表中的记录包含从 2008 年到 2014 年的 dateTimeTaken 值。没有任何记录包含 null 或空 dateTimeTaken 值。

当通过 LINQPad 查询时,我得到“2008-04-25 10:38:56”这个查询:

SELECT MIN(dateTimeTaken) FROM PhotraxBaseData

....和“2014-04-27 19:26:09”对于“SELECT MAX(...”

IOW,LINQPad 给了我我所期望的。然而,当我运行这段代码时:

dateFrom.Date = PhotraxSQLiteUtils.GetEarliestDate();
dateTo.Date = PhotraxSQLiteUtils.GetLatestDate();
 . . .
internal static DateTimeOffset GetEarliestDate()
{
    DateTimeOffset dto;
    using (var db = new SQLite.SQLiteConnection(App.DBPath))
    {
        string sql = "SELECT MIN(dateTimeTaken) FROM PhotraxBaseData";
        dto = db.ExecuteScalar<DateTimeOffset>(sql);
    }
    return dto;
}

注意:GetLatestDate() 方法与 GetEarliestDate() 方法相同,不同之处在于使用 MAX insted of MIN

...在这两种情况下,方法实际返回的是“1/1/0001”,数据控件中显示的是“1/1/1914”。数据控件以这种方式声明:

<StackPanel Orientation="Horizontal">
    <TextBlock Text="Photos taken between">
    </TextBlock>
    <DatePicker x:Name="dateFrom">
    </DatePicker>
</StackPanel>
<StackPanel Orientation="Horizontal">
    <TextBlock Text="and">
    </TextBlock>
    <DatePicker x:Name="dateTo">
    </DatePicker>

为什么我没有得到正确的价值观?以及如何获取实际的 MIN 和 MAX 日期(而不是返回“1/1/0001”和显示“1/1/1914”,以填充 DateTimeOffset 变量以及随后的 DatePicker XAML 控件?

注意:我在SQLite 浏览器中看到创建 SQLite 表时似乎可用的唯一数据类型是整数、文本、BLOB、实数和数字

所以也许我的问题是类的 DateTime 成员 (dateTimeTaken) 在 SQLite 表中没有相应的数据类型,因此被存储为......什么?文本?处理此问题的适当方法是将类中的数据类型从 DateTime 更改为 String,然后确保数据存储为“20141103_111111”(yyyymmdd_hhmmss)或类似的,以便准确排序?

4

1 回答 1

2

我认为您需要指定数据库返回的确切类型,然后在获得它后在客户端进行转换。

由于返回的值可以是任何类型,因此它被装箱到一个对象中。要取消装箱,您必须首先将其转换为最初装箱的确切类型。然后你把它转换成你需要的任何类型。

换句话说,指定DateTime这是否是您从数据库中获取的值:

internal static DateTimeOffset GetEarliestDate()
{
    DateTimeOffset dto;
    using (var db = new SQLite.SQLiteConnection(App.DBPath))
    {
        string sql = "SELECT MIN(dateTimeTaken) FROM PhotraxBaseData";
        dto = (DateTimeOffset)db.ExecuteScalar<DateTime>(sql);
    }
    return dto;
}

另外,我不知道将值转换为 aDateTimeOffset是否是您想要做的。您可能只想将方法的返回类型更改为DateTime.

于 2014-11-04T01:15:37.850 回答