如何从SQLite表中获取实际的日期时间值?

时间:2014-11-04 01:00:28

标签: c# sqlite winrt-xaml datetimeoffset executescalar

我正在查询具有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" for" 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

...在这两种情况下,从这些方法实际返回的是&#34; 1/1 / 0001&#34;数据控件中显示的内容是&#34; 1/1/1914&#34;。数据控件以这种方式声明:

<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日期(而不是&#34; 1/1/0001&#34;返回&#34; 1/1/1914&#34;显示,以填充DateTimeOffset变量,然后填写DatePicker XAML控件?

注意:我在SQLite Browser中看到,创建SQLite表时似乎唯一可用的数据类型是Integer,Text,BLOB,Real和Numeric

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

1 个答案:

答案 0 :(得分: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;
}

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