Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当日期存储为记号时,为什么strftime()在Sqlite中不起作用?_C#_Sqlite - Fatal编程技术网

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表示您将使用默认的
ISO8601
,它允许日期早于
1970-01-01
,并且很可能是断言通过的原因


请参见
Sqlite
中的
Integer
使用
Unix时间
,允许最早的日期为
1970-01-01 00:00:00 UTC
。因此,1968年的值将是一个错误,不会通过
Assert.AreEqual(“2013”,年份)

删除
DateTimeFormat=Ticks表示您将使用默认的
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时间。我没有试着把括号放进去,但由于它在不使用记号的情况下工作正常,我怀疑这会是个问题。