【问题标题】:How can I get the actual datetime values from a SQLite table?如何从 SQLite 表中获取实际的日期时间值?
【发布时间】:2014-12-30 19:23:05
【问题描述】:

我正在查询一个具有 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 代替 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 Browser 中看到,在创建 SQLite 表时似乎可用的唯一数据类型是整数、文本、BLOB、实数和数字

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

【问题讨论】:

    标签: c# sqlite winrt-xaml datetimeoffset executescalar


    【解决方案1】:

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

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

    换句话说,如果这是您从数据库中获取的值,请指定 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

    【讨论】:

    • 完美!现在我可以告诉沙鼠他们可以“吃 5 个”
    • 您能解释一下 <...>(string) 在 c# 中的含义吗?我的意思是在语句 (SELECT...)?谢谢你。这与解析结果有何不同?
    • 再来一张!有没有更好的方法来存储日期时间?也许是儒略化的价值?
    • 感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多