Frage

Ist es möglich, in einer SQLite-Datenbank eine Tabelle craete, die eine Timestamp-Spalte hat, dass standardmäßig DATETIME('now')?

Wie folgt aus:

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

Das gibt einen Fehler ... Wie zu lösen?

War es hilfreich?

Lösung

ich glaube Sie verwenden können,

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

ab Version 3.1 ( Quelle )

Andere Tipps

nach dr. hipp in einer aktuellen Liste Beitrag:

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);

Es ist nur ein Syntaxfehler, müssen Sie Klammern: (DATETIME('now'))

Wenn Sie auf der Dokumentation anschauen, werden Sie die Klammer beachten Sie, dass um die 'expr' Option in der Syntax hinzugefügt wird.

Dies ist ein vollständiges Beispiel basierend auf den anderen Antworten und Kommentare auf die Frage. Im Beispiel wird die Zeitstempel (created_at-Spalte) gespeichert als Unix-Epoche UTC-Zeitzone und umgerechnet in lokalen Zeitzone nur bei Bedarf.

Epoche UNIX spart Speicherplatz - 4 Byte integer vs. 24 Byte Zeichenkette, wenn sie als ISO8601 String gespeichert sind, finden Sie unter Datentypen . Wenn 4 Bytes nicht genug ist, die 6 oder 8 Bytes erhöht werden kann.

Speicher Zeitstempel auf UTC-Zeitzone macht es bequem einen angemessenen Wert auf mehreren Zeitzonen zu zeigen.

SQLite-Version 3.8.6, die ausgeliefert wird mit 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

Localtime ist richtig, wie ich bei UTC + 2 DST im Moment der Abfrage befindet bin.

Es kann besser sein REAL-Typen zu verwenden, um Speicherplatz zu sparen.

Quote von 1.2 Abschnitt Datentypen In SQLite Version 3

  

SQLite hat keine Speicherklasse vorbehaltene Daten speichern   und / oder Zeiten. Stattdessen wird der eingebaute in Datums- und Zeitfunktionen von SQLite   der Lage sind, Daten und Zeiten als TEXT, real oder INTEGER des Speicherns   Werte

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t REAL DEFAULT (datetime('now', 'localtime'))
);

finden Sie unter Spalten-Integritäts .

Und Einsatz eine Reihe ohne jeden Wert bereitstellt.

INSERT INTO "test" DEFAULT VALUES;

Es ist Syntaxfehler, weil Sie nicht Klammer geschrieben haben

, wenn Sie schreiben

  

Wählen Sie Datetime ( 'now')   dann wird es Sie UTC-Zeit geben, aber wenn Sie dies es Abfrage schreiben, dann müssen Sie Klammern, bevor diese hinzufügen   so (Datumzeit ( 'jetzt')) für die UTC-Zeit.   für Ortszeit gleichen   Wählen Sie Datetime ( ‚jetzt‘, ‚localtime‘)   für die Suche nach

(Datumzeit ( 'jetzt', 'localtime'))

Dieses alternative Beispiel wird die lokale Zeit als Integer die 20 Bytes zu speichern. Die Arbeit wird im Feld Standard, Update-Trigger durchgeführt und Ansicht. strftime muss ‚% s‘ (einfache Anführungszeichen), weil „% s“ (doppelte Anführungszeichen) verwenden, um eine ‚nicht konstant‘ Fehler auf mich geworfen hat.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top