SQLiteで自動タイムスタンプを取得するにはどうすればよいですか?


132

SQLiteデータベースのバージョン3があり、C#を使用して、このデータベースを使用するアプリケーションを作成しています。

テーブルのタイムスタンプフィールドを同時実行に使用したいのですが、新しいレコードを挿入すると、このフィールドが設定されず、nullになっています。

たとえば、MS SQL Serverでは、タイムスタンプフィールドを使用する場合、これはデータベースによって更新されるため、自分で設定する必要はありません。SQLiteでこれは可能ですか?

回答:


212

フィールドのデフォルト値を宣言するだけです:

CREATE TABLE MyTable(
    ID INTEGER PRIMARY KEY,
    Name TEXT,
    Other STUFF,
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

ただし、INSERTコマンドでこのフィールドを明示的にに設定した場合は、NULLに設定されNULLます。


5
これはシステムクロックに基づいているため、SQL Serverのタイムスタンプとはまったく異なります。クロックを変更すると、値が逆になる可能性があります。SQL Serverでは、タイムスタンプ値は常に増加します。
Rory MacLeod 2013年

26
@Matthieu DATETIME データ型はありませんが、SQLiteはフィールド型として何でも受け入れます。
CL。

4
@Matthieu uが提供したリンクにSQLiteで言及されているDATETIMEデータ型があります。2.2アフィニティ名の例を読む
Rafique Mohammed 2015

6
これはUPDATEステートメントをカバーしていないようです。トリガーがこれを行う唯一の方法のようです。
デールアンダーソン

2
@CL申し訳ありませんが、あなたは正しいです。私はあなたの答えとJAVEDの答えを誤ってマージしました。DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime'))1が実際に意味のあるマイクロ秒の値を取得します。
Dietmar 2017年

71

SQLiteのテーブルにTIMESTAMPフィールドを作成できます。これを参照してください:

CREATE TABLE my_table (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name VARCHAR(64),
    sqltime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

INSERT INTO my_table(name, sqltime) VALUES('test1', '2010-05-28T15:36:56.200');
INSERT INTO my_table(name, sqltime) VALUES('test2', '2010-08-28T13:40:02.200');
INSERT INTO my_table(name) VALUES('test3');

これが結果です:

SELECT * FROM my_table;

ここに画像の説明を入力してください


デフォルトが定数でない列は追加できません(ALTER TABLE "main"。 "xxx_data" ADD COLUMN "created_date" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)
toing_toing

14

読み込みdatefunc自動日時完了の作業例は次のようになります。

sqlite> CREATE TABLE 'test' ( 
   ...>    'id' INTEGER PRIMARY KEY,
   ...>    'dt1' DATETIME NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')), 
   ...>    'dt2' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')), 
   ...>    'dt3' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime'))
   ...> );

自動日時完了を開始する方法でいくつかの行を挿入しましょう:

sqlite> INSERT INTO 'test' ('id') VALUES (null);
sqlite> INSERT INTO 'test' ('id') VALUES (null);

保存されたデータは、最初の2つは同じであるが3番目の関数は同じでないことを明確に示しています。

sqlite> SELECT * FROM 'test';
1|2017-09-26 09:10:08|2017-09-26 09:10:08|2017-09-26 09:10:08.053
2|2017-09-26 09:10:56|2017-09-26 09:10:56|2017-09-26 09:10:56.894

SQLite関数が括弧で囲まれていることに注意してください!これを1つの例で示すのはどれほど困難でしたか?

楽しんで!


7

トリガーを使用できます。とてもうまくいく

CREATE TABLE MyTable(
ID INTEGER PRIMARY KEY,
Name TEXT,
Other STUFF,
Timestamp DATETIME);


CREATE TRIGGER insert_Timestamp_Trigger
AFTER INSERT ON MyTable
BEGIN
   UPDATE MyTable SET Timestamp =STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

CREATE TRIGGER update_Timestamp_Trigger
AFTER UPDATE On MyTable
BEGIN
   UPDATE MyTable SET Timestamp = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

6

上記の回答を補足するには...

EFを使用している場合は、プロパティをデータアノテーション[タイムスタンプ]で修飾し、コンテキストクラス内のオーバーライドされたOnModelCreatingに移動して、次のFluent APIコードを追加します。

modelBuilder.Entity<YourEntity>()
                .Property(b => b.Timestamp)
                .ValueGeneratedOnAddOrUpdate()
                .IsConcurrencyToken()
                .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");

このテーブルに挿入されるすべてのデータにデフォルト値を作成します。


Xamarinアプリで、エンティティがAndroidでどのように機能するかを知っていますか?テストに慣れていませんが、DALを置き換えるとよいでしょう。
samis

sqliteHasDefaultに必要なパッケージが見つかりません。私がnugetから取得する必要があるパッケージを知っていますか?
Simons0n 2018年

@ Simons0n、このMicrosoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder名前空間を使用してみてください。
ラファエル

2

次を使用してカスタム日時を使用できます...

 create table noteTable3 
 (created_at DATETIME DEFAULT (STRFTIME('%d-%m-%Y   %H:%M', 'NOW','localtime')),
 title text not null, myNotes text not null);

'NOW'、 'localtime'を使用して現在のシステム日付を取得します。それ以外の場合は、データベースに挿入した後、データベースの過去またはその他の時刻が表示されます。

ありがとうございます...


1
マイクロ秒が必要な場合に役立ちます。DEFAULT(STRFTIME( '%Y-%m-%d%H:%M:%f'、 'NOW'、 'localtime')) `を使用できます。DEFAULT CURRENT_TIMESTAMPと言うだけでは、1秒の粒度しか得られません。
Dietmar 2017年

これは間違いなく動作します!括弧で囲まれているstrftime()に注意してください!
センチュリアン

0

SQLite DB-Browserを使用する場合、次の方法でデフォルト値を変更できます。

  1. データベース構造を選択
  2. テーブルを選択
  3. テーブルを変更する
  4. 列の「デフォルト値」の下に値を入れます:=(datetime( 'now'、 'localtime'))

値の形式が正しくない場合、SQLLiteブラウザで問題が発生する可能性があるため、事前にデータベースを更新することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.