211

sqlite データベースで、デフォルトのタイムスタンプ列を持つテーブルを作成することは可能DATETIME('now')ですか?

このような:

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t TIMESTAMP DEFAULT DATETIME('now')
);

これによりエラーが発生します... 解決方法は?

4

8 に答える 8

322

私はあなたが使用できると信じています

CREATE TABLE test (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  t TIMESTAMP
  DEFAULT CURRENT_TIMESTAMP
);

バージョン 3.1 以降 (ソース)

于 2008-10-14T08:01:44.233 に答える
107

博士によると 最近のリスト投稿のヒップ:

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);
于 2008-10-23T00:44:24.457 に答える
56

これは単なる構文エラーです。括弧が必要です:(DATETIME('now'))

documentationを見ると、構文の「expr」オプションの周りに括弧が追加されていることに気付くでしょう。

于 2009-04-15T22:47:15.980 に答える
25

これは、質問に対する他の回答とコメントに基づく完全な例です。この例では、タイムスタンプ ( created_at-column) はUNIX エポックUTC タイムゾーンとして保存され、必要な場合にのみローカル タイムゾーンに変換されます。

UNIX エポックを使用すると、ストレージ スペースが節約されます。ISO8601 文字列として格納されている場合、4 バイトの整数に対して 24 バイトの文字列です。 datatypesを参照してください。4 バイトでは不十分な場合は、6 または 8 バイトに増やすことができます。

タイムスタンプを UTC タイムゾーンで保存すると、複数のタイムゾーンで適切な値を表示するのに便利です。

SQLite のバージョンは 3.8.6 で、Ubuntu LTS 14.04 に同梱されています。

$ 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 にいるため、Localtime は正しいです。

于 2014-09-30T17:52:54.047 に答える
10

ストレージスペースを節約するには、REAL 型を使用する方がよい場合があります。

SQLite バージョン 3のデータ型の 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;
于 2013-11-21T12:59:04.550 に答える
5

括弧を書いていないので構文エラーです

あなたが書くなら

datetime('now') を選択すると utc 時刻が表示されますが、このクエリを記述する場合は、この前に括弧を追加する必要があるため、UTC 時刻には (datetime('now')) を指定します。現地時間の場合と同じ クエリに datetime('now','localtime') を選択

(datetime('今','現地時間'))

于 2013-04-26T06:50:56.247 に答える