11

日付を目盛りとして保存するSQLiteデータベースがあります。デフォルトのISO8601形式を使用していません。次のように定義されたテーブルがあるとします。

CREATE TABLE TestDate (LastModifiedTime DATETIME)

SQLを使用して、現在の日付と時刻を挿入したいと思います。以下のステートメントのいずれかを実行すると、日付と時刻が目盛りではなく文字列として保存されることになります。

INSERT INTO TestDate (LastModifiedTime) VALUES(CURRENT_TIMESTAMP)
INSERT INTO TestDate (LastModifiedTime) VALUES(DateTime('now'))

SQLiteのドキュメントを見てきましたが、現在のタイムスタンプをティックで取得するオプションが見つからないようです。

もちろん、C#でパラメーターを定義し、その値をSystem.DateTimeとして格納することもできます。これにより、日時がティック単位でデータベースに保存されます。

私がやりたいのは、SQLステートメント内から直接現在のタイムスタンプを挿入および更新できるようにすることです。どうすればいいですか?

編集:

データをティックとしてデータベースに保存する理由は、日付がADO.Netデータプロバイダーによって保存されるのと同じ形式で保存されるため、データがADO.Netプロバイダーを使用してクエリされる場合も同様です。 System.DataTime.Netタイプとして正しく取得されます。

4

3 に答える 3

21

SQLiteのこの特定の奇妙さは、私に多くの苦痛を引き起こしました。

簡単な方法-通常のタイムスタンプとして保存および取得

create table TestDate (
        LastModifiedTime datetime
);
insert into TestDate (LastModifiedTime) values (datetime('now'));
select datetime(LastModifiedTime), strftime('%s.%f', LastModifiedTime)  from TestDate;

出力:2011-05-10 21:34:46 | 1305063286.46.000

面倒な方法-UNIXタイムスタンプとして保存および取得

strftimeを使用して、ティック単位の値を取得できます。さらに、UNIXタイムスタンプ(ティックとほぼ同等)を格納するために、秒数を一重引用符で囲むことができます。

 insert into TestDate (LastModifiedTime) values ('1305061354');

SQLiteは、これをUNIXタイムスタンプではない他の値として内部的に保存します。取得時に、UNIXタイムスタンプとして取得するようにSQLiteに明示的に指示する必要があります。

 select datetime(LastModifiedTime, 'unixepoch') FROM TestDate;

現在の日付と時刻を保存するには、strftime('%s'、'now')を使用します。

 insert into TestDate (LastModifiedTime) VALUES (strftime('%s', 'now'));

完全な例:

create table TestDate (
        LastModifiedTime datetime
);      
insert into TestDate (LastModifiedTime) values (strftime('%s', 'now'));
select datetime(LastModifiedTime, 'unixepoch') from TestDate;

sqlite3によって実行される場合、このスクリプトは次のように出力されます。

2011-05-10 21:02:34 (or your current time)
于 2011-05-10T20:56:21.347 に答える
3

日付番号の変換に関するSQLiteのドキュメントやその他の情報をさらに調査した結果、次の式を思いつきました。これにより、正しい結果が得られるようです。

INSERT INTO TestDate(LastModifiedTime)
    VALUES(CAST((((JulianDay('now', 'localtime') - 2440587.5)*86400.0) + 62135596800) * 10000000 AS BIGINT))

組み込みの日時形式として利用できると期待するものを作成するのは面倒な方法のようです。特に、データベースが日時値のティックへの格納をサポートしている場合はそうです。うまくいけば、これは他の人にも役立つようになります。

アップデート:

上記の式は、夏時間に関しては完全ではありません。現地時間の計算については、SQLiteドキュメントの「警告とバグ」のセクションを参照してください。

于 2011-05-11T19:16:21.630 に答える
1

以下は、UNIXエポックからのミリ秒数を返します。

SELECT (strftime('%s', 'now') - strftime('%S', 'now') + strftime('%f', 'now')) * 1000 AS ticks

これは、Unixエポックからの秒数(%s )を取得し、現在の時刻の秒数( %S )を減算し、小数点以下の桁数(%f )で秒数を加算し、結果に1000を掛けることによって機能します。秒からミリ秒に変換します。

減算と加算は、結果を歪めることなく値に精度を追加することです。SQLiteのドキュメントに記載されているように、同じステップで「now」を使用すると、同じ値が返されます。

于 2013-12-09T18:51:19.130 に答える