1

我有以下代码:

    [Test]
    public void SqliteTest()
    {
        var insertQuery = @"insert into MetricData (Date) Values (@date)";
        var selectQuery = @"select strftime('%Y',Date) as 'year', Date from MetricData";

        var connectionString = "Data Source=:memory:;Version=3;DateTimeFormat=Ticks;";
        using (var db = new SQLiteConnection(connectionString))
        {
            db.Open();
            DatabaseSchemaBuilder.InitializeSchema(db);

            var testDate = DateTime.Now;
            using (var cmd = new SQLiteCommand(insertQuery, db))
            {
                cmd.Parameters.AddWithValue("@date", testDate);
                cmd.ExecuteNonQuery();
            }

            using (var cmd = new SQLiteCommand(selectQuery, db))
            {
                using (var reader = cmd.ExecuteReader())
                {
                    reader.Read();
                    var queriedDate = reader.GetDateTime(1);
                    var year = reader.GetString(0);

                    Assert.AreEqual(testDate, queriedDate);
                    Assert.AreEqual("2013", year);
                }
            }
        }
    }

当我运行此代码时,第一个断言通过但第二个断言失败,年份等于 1968(其他格式值也不正确,例如月份返回为 19)。

查看原始查询输出时,年份结果为1968,日期为635120225608999130

为什么strftime()在这种情况下无法正常工作?

编辑: 只是添加,我定义为的日期列Date integer。此外,如果我不包含DateTimeFormat=Ticks在连接字符串中,则所有断言都会通过。

4

1 回答 1

1

Date就像IntegerSqlite使用Unix Time中允许最早的日期一样1970-01-01 00:00:00 UTC。因此 1968 年的值将是一个错误并且不会通过Assert.AreEqual("2013",year).

查看文档

并且在您的连接字符串中删除DateTimeFormat=Ticks;意味着您将使用ISO8601允许日期之前的默认值,1970-01-01并且很可能是您的断言通过的原因。

参考

于 2013-08-14T14:15:40.540 回答