我有以下代码:
[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
,则所有断言都将通过。
最佳答案
Date
作为Integer
中的Sqlite
使用Unix Time
,它允许最早的日期为1970-01-01 00:00:00 UTC
。因此,1968年的值将是一个错误,并且不会通过Assert.AreEqual("2013",year)
。
见Documentation
并且在连接字符串中删除DateTimeFormat=Ticks;
意味着您将使用默认的ISO8601
,该默认值允许日期在1970-01-01
之前,并且很有可能是Assert通过的原因。
见Reference
关于c# - 当日期存储为刻度时,为什么strftime()在Sqlite中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18221407/