質問
sqliteデータベースでは、デフォルトで DATETIME( 'now')
のタイムスタンプ列を持つテーブルを作成できますか?
これに似ています:
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT DATETIME('now')
);
これはエラーになります...解決方法?
解決
私はあなたが使用できると信じています
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
);
バージョン3.1以降(ソース)
他のヒント
博士によると。最近のリスト投稿のヒップ:
CREATE TABLE whatever(
....
timestamp DATE DEFAULT (datetime('now','localtime')),
...
);
これは単なる構文エラーです。括弧が必要です:(DATETIME( 'now'))
ドキュメントを見ると、括弧に注意してください。構文の「expr」オプションの周りに追加されます。
これは、質問に対する他の回答とコメントに基づく完全な例です。この例では、タイムスタンプ( created_at
-column)は unix epoch UTCタイムゾーンおよび必要な場合にのみローカルタイムゾーンに変換されます。
Unixエポックを使用すると、保存スペースが節約されます-ISO8601文字列として保存する場合、24バイト文字列に対して4バイト整数。を参照してください。データ型。 4バイトでは不十分な場合、6または8バイトに増やすことができます。
UTCタイムゾーンでタイムスタンプを保存すると、複数のタイムゾーンで適切な値を表示するのに便利です。
SQLiteバージョンは、Ubuntu LTS 14.04に同梱されている3.8.6です。
$ sqlite3 so.db
SQLite version 3.8.6 2014-08-15 11:46:33
Enter ".help" for usage hints.
sqlite> .headers on
create table if not exists example (
id integer primary key autoincrement
,data text not null unique
,created_at integer(4) not null default (strftime('%s','now'))
);
insert into example(data) values
('foo')
,('bar')
;
select
id
,data
,created_at as epoch
,datetime(created_at, 'unixepoch') as utc
,datetime(created_at, 'unixepoch', 'localtime') as localtime
from example
order by id
;
id|data|epoch |utc |localtime
1 |foo |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02
2 |bar |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02
クエリの時点でUTC + 2 DSTにいるため、現地時間は正しいです。
ストレージスペースを節約するために、REALタイプを使用することをお勧めします。
の1.2セクションからの引用SQLiteには、日付を保存するためのストレージクラスがありません および/または時間。代わりに、SQLiteの組み込みの日付と時刻の関数 日付と時刻をTEXT、REAL、またはINTEGERとして保存できます 値
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t REAL DEFAULT (datetime('now', 'localtime'))
);
column-constraint を参照してください。
および値を指定せずに行を挿入します。
INSERT INTO "test" DEFAULT VALUES;
括弧を書いていないため、構文エラーです
書く場合
datetime( 'now')を選択します それはあなたにUTC時間を与えますが、これをクエリに書く場合は、この前に括弧を追加する必要があります UTC時間の場合は(datetime( 'now')) 現地時間同じ datetime( 'now'、 'localtime')を選択します クエリ用
(datetime( 'now'、 'localtime'))
この代替例では、ローカル時間を整数として保存して20バイトを節約します。作業は、フィールドのデフォルト、更新トリガー、および表示で行われます。 strftimeは、「%s」(単一引用符)を使用する必要があります。これは、「%s」 (二重引用符)が 'Not Constant'エラーをスローしました。
Create Table Demo (
idDemo Integer Not Null Primary Key AutoIncrement
,DemoValue Text Not Null Unique
,DatTimIns Integer(4) Not Null Default (strftime('%s', DateTime('Now', 'localtime'))) -- get Now/UTC, convert to local, convert to string/Unix Time, store as Integer(4)
,DatTimUpd Integer(4) Null
);
Create Trigger trgDemoUpd After Update On Demo Begin
Update Demo Set
DatTimUpd = strftime('%s', DateTime('Now', 'localtime')) -- same as DatTimIns
Where idDemo = new.idDemo;
End;
Create View If Not Exists vewDemo As Select -- convert Unix-Times to DateTimes so not every single query needs to do so
idDemo
,DemoValue
,DateTime(DatTimIns, 'unixepoch') As DatTimIns -- convert Integer(4) (treating it as Unix-Time)
,DateTime(DatTimUpd, 'unixepoch') As DatTimUpd -- to YYYY-MM-DD HH:MM:SS
From Demo;
Insert Into Demo (DemoValue) Values ('One'); -- activate the field Default
-- WAIT a few seconds --
Insert Into Demo (DemoValue) Values ('Two'); -- same thing but with
Insert Into Demo (DemoValue) Values ('Thr'); -- later time values
Update Demo Set DemoValue = DemoValue || ' Upd' Where idDemo = 1; -- activate the Update-trigger
Select * From Demo; -- display raw audit values
idDemo DemoValue DatTimIns DatTimUpd
------ --------- ---------- ----------
1 One Upd 1560024902 1560024944
2 Two 1560024944
3 Thr 1560024944
Select * From vewDemo; -- display automatic audit values
idDemo DemoValue DatTimIns DatTimUpd
------ --------- ------------------- -------------------
1 One Upd 2019-06-08 20:15:02 2019-06-08 20:15:44
2 Two 2019-06-08 20:15:44
3 Thr 2019-06-08 20:15:44