C# 当日期存储为记号时,为什么strftime()在Sqlite中不起作用?
我有以下代码:C# 当日期存储为记号时,为什么strftime()在Sqlite中不起作用?,c#,sqlite,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 =
[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()
不能正常工作
编辑:
只需添加,我定义的日期列为
dateinteger
。另外,如果我没有在连接字符串中包含DateTimeFormat=Ticks
,所有断言都会通过。Date
作为Sqlite
中的Integer
使用Unix时间
,它允许最早的日期为1970-01-01 00:00 UTC
。因此,1968年的值将是一个错误,不会通过Assert.AreEqual(“2013”,年份)
看
删除DateTimeFormat=Ticks连接字符串中的code>表示您将使用默认的ISO8601
,它允许日期早于1970-01-01
,并且很可能是断言通过的原因
请参见Sqlite
中的Integer
使用Unix时间
,允许最早的日期为1970-01-01 00:00:00 UTC
。因此,1968年的值将是一个错误,不会通过Assert.AreEqual(“2013”,年份)
看
删除DateTimeFormat=Ticks连接字符串中的code>表示您将使用默认的ISO8601
,它允许日期早于1970-01-01
,并且很可能是断言通过的原因
请参见So,Assert.AreEqual(“2013”,年份)
就是您所说的错误弹出的地方?正确,是Assert.AreEqual(testDate,queryeddate)
assert passesSo,assert.AreEqual(“2013”,年份)
就是您所说的错误弹出的地方?正确,assert.AreEqual(testDate,queryeddate)代码>断言密码与使用旧日期无关。我使用的是2013年的日期(从代码中可以看出)。问题是sqlite错误地将日期解释为1968年,并错误地读取了时间。我知道代码中不是年份(即2013年),但从表中可以看出,这就是为什么我要指出那个年份。不管怎么说,Date是一个保留字,你有没有试过在它上面加一个方括号,比如[Date]?很高兴知道这一点,我想知道在运行strftime()之前是否需要将c#ticks转换为unix时间。我没有试着把括号放进去,但由于它在不使用记号的情况下工作正常,我怀疑这会是问题所在。它与使用旧日期无关。我使用的是2013年的日期(从代码中可以看出)。问题是sqlite错误地将日期解释为1968年,并错误地读取了时间。我知道代码中不是年份(即2013年),但从表中可以看出,这就是为什么我要指出那个年份。不管怎么说,Date是一个保留字,你有没有试过在它上面加一个方括号,比如[Date]?很高兴知道这一点,我想知道在运行strftime()之前是否需要将c#ticks转换为unix时间。我没有试着把括号放进去,但由于它在不使用记号的情况下工作正常,我怀疑这会是个问题。