当日期存储为刻度时,为什么strftime()在Sqlite中不起作用?

时间:2013-08-14 00:33:05

标签: c# sqlite

我有以下代码:

    [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,则所有断言都会通过。

1 个答案:

答案 0 :(得分:1)

DateInteger的{​​{1}}使用SqliteUnix Time允许最早的1970-01-01 00:00:00 UTC日期。因此,1968年的价值将是一个错误,不会通过Assert.AreEqual("2013",year)

请参阅Documentation

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

请参阅Reference