我有以下代码:
[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
,则所有断言都会通过。
答案 0 :(得分:1)
Date
中Integer
的{{1}}使用Sqlite
,Unix Time
允许最早的1970-01-01 00:00:00 UTC
日期。因此,1968年的价值将是一个错误,不会通过Assert.AreEqual("2013",year)
。
删除连接字符串中的DateTimeFormat=Ticks;
意味着您将使用允许ISO8601
之前的默认1970-01-01
,这很可能是您的Assert通过的原因。
请参阅Reference