1

次のコードがあります。

    [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と、すべてのアサーションがパスします。

4

1 に答える 1

1

Dateの最も古い日付を許可するInteger用途Sqliteのように。したがって、1968 年の値はエラーになり、.Unix Time1970-01-01 00:00:00 UTCAssert.AreEqual("2013",year)

ドキュメントを見る

また、接続文字列を削除すると、Assert が渡される可能性が最も高い理由より前の日付を許可DateTimeFormat=Ticks;するデフォルトを使用することになります。ISO86011970-01-01

リファレンスを参照

于 2013-08-14T14:15:40.540 に答える