Wie habe ich einen automatischen Zeitstempel in SQLite?

131

Ich habe eine SQLite-Datenbank, Version 3, und verwende C #, um eine Anwendung zu erstellen, die diese Datenbank verwendet.

Ich möchte ein Zeitstempelfeld in einer Tabelle für die Parallelität verwenden, aber ich stelle fest, dass dieses Feld beim Einfügen eines neuen Datensatzes nicht festgelegt ist und null ist.

Wenn ich beispielsweise in MS SQL Server ein Zeitstempelfeld verwende, das von der Datenbank aktualisiert wird, muss ich es nicht selbst festlegen. ist das in SQLite möglich?

Álvaro García
quelle

Antworten:

211

Deklarieren Sie einfach einen Standardwert für ein Feld:

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

Wenn Ihr INSERTBefehl dieses Feld jedoch explizit auf setzt NULL, wird es auf gesetzt NULL.

CL.
quelle
5
Dies entspricht nicht ganz dem Zeitstempel von SQL Server, da er auf der Systemuhr basiert. Wenn Sie die Uhr ändern, kann der Wert rückwärts gehen. In SQL Server werden die Zeitstempelwerte immer erhöht.
Rory MacLeod
25
@Matthieu Es gibt keinen DATETIME Datentyp, aber SQLite nimmt alles als Feldtyp.
CL.
4
@Matthieu In dem von Ihnen angegebenen Link wird in SQLite der Datentyp DATETIME erwähnt. Lesen Sie 2.2 Beispiele für Affinitätsnamen
Rafique Mohammed
6
Dies scheint keine UPDATE-Anweisungen abzudecken. Es sieht so aus, als wäre ein Auslöser der einzige Weg, dies zu tun.
Dale Anderson
2
@CL Entschuldigung, du hast recht. Ich habe Ihre Antwort falsch zusammengeführt und die von javed. Mit DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime'))einem bekommt man tatsächlich aussagekräftige Mikrosekundenwerte.
Dietmar
70

Sie können das TIMESTAMP-Feld in einer Tabelle auf der SQLite erstellen.

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');

Das ist das Ergebnis:

SELECT * FROM my_table;

Geben Sie hier die Bildbeschreibung ein

mr.boyfox
quelle
Es kann keine Spalte mit nicht konstanter Standardeinstellung hinzugefügt werden (ALTER TABLE "main". "Xxx_data" ADD COLUMN "created_date" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)
toing_toing
13

Das Lesen von datefunc wäre ein funktionierendes Beispiel für die automatische Vervollständigung von Datum und Uhrzeit:

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'))
   ...> );

Fügen Sie einige Zeilen so ein, dass die automatische Vervollständigung von Datum und Uhrzeit eingeleitet wird:

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

Die gespeicherten Daten zeigen deutlich, dass die ersten beiden gleich sind, aber nicht die dritte Funktion:

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

Beachten Sie, dass SQLite-Funktionen in Klammern stehen! Wie schwierig war es, dies in einem Beispiel zu zeigen?

Habe Spaß!

Centurian
quelle
7

Sie können Trigger verwenden. funktioniert sehr gut

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;
Rahmat Anjirabi
quelle
6

Um die obigen Antworten zu ergänzen ...

Wenn Sie EF verwenden, schmücken Sie die Eigenschaft mit Data Annotation [Timestamp], wechseln Sie dann zu dem überschriebenen OnModelCreating in Ihrer Kontextklasse und fügen Sie diesen Fluent API-Code hinzu:

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

Für alle Daten, die in diese Tabelle eingefügt werden, wird ein Standardwert festgelegt.

Rafael
quelle
Wissen Sie, wie sich Entity unter Android in einer Xamarin-App verhält? Ich bin noch nicht zum Testen gekommen, aber es wäre schön, DAL durch zu ersetzen.
Samis
Ich finde nicht das Paket, das für den sqliteHasDefault benötigt wird. Weißt du, welches Paket ich von Nuget bekommen muss?
Simons0n
@ Simons0n, versuchen Sie, diesen Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder-Namespace zu verwenden.
Rafael
2

Sie können die benutzerdefinierte Datums- und Uhrzeitangabe verwenden, indem Sie ...

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

Verwenden Sie 'JETZT', 'Ortszeit', um das aktuelle Systemdatum abzurufen. Andernfalls wird nach dem Einfügen in Ihre Datenbank eine vergangene oder andere Zeit in Ihrer Datenbank angezeigt.

Danke...

Javed
quelle
1
Nützlich, wenn Sie Mikrosekunden benötigen; Sie können DEFAULT (STRFTIME ('% Y-% m-% d% H:% M:% f', 'JETZT', 'Ortszeit') verwenden. Wenn Sie nur DEFAULT CURRENT_TIMESTAMP sagen, erhalten Sie nur eine Granularität von einer Sekunde.
Dietmar
Das funktioniert definitiv! Achten Sie auf strftime (), da es in Klammern steht!
Centurian
0

Wenn Sie den SQLite DB-Browser verwenden, können Sie den Standardwert folgendermaßen ändern:

  1. Wählen Sie die Datenbankstruktur
  2. Wählen Sie die Tabelle aus
  3. Tabelle ändern
  4. Geben Sie in Ihrer Spalte unter 'Standardwert' den Wert ein: = (Datum / Uhrzeit ('Jetzt', 'Ortszeit'))

Ich empfehle, Ihre Datenbank vorher zu aktualisieren, da ein falsches Format im Wert zu Problemen im SQLLite-Browser führen kann.

SJX
quelle