我正在查询具有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)或其他类似的,为了准确排序?
答案 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
。