次のコードがあります。
[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);
}
}
}
}
このコードを実行すると、最初のアサーションは成功しますが、2 番目のアサーションは失敗し、年は 1968 になります (他の形式の値も正しくありません。たとえば、月は 19 として返されます)。
生のクエリ出力を見ると、年の結果は1968
で、日付は635120225608999130
です。
strftime()
このインスタンスで が正しく機能しないの はなぜですか?
編集:
追加するだけで、私が定義した Date 列はDate integer
. また、接続文字列に含めないDateTimeFormat=Ticks
と、すべてのアサーションがパスします。