web-dev-qa-db-ja.com

SQLiteで自動タイムスタンプを取得する方法は?

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

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

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

115
Álvaro García

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

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

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

181
CL.

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;

enter image description here

62
mr.boyfox

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関数は括弧で囲まれていることに注意してください!一例でこれを示すのはどれくらい難しかったですか?

楽しむ!

9
centurian

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

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
Rahmat Anjirabi

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

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

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

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

5
Rafael

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

 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'を使用して現在のシステム日付を取得します。それ以外の場合は、dbに挿入した後、データベースに過去またはその他の時間を表示します。

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

2
Javed