Est-il possible, dans une base de données sqlite, de créer une table dont la colonne timestamp est définie par défaut sur DATETIME('now')
?
Comme ça:
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT DATETIME('now')
);
Cela donne une erreur ... Comment résoudre?
je crois que tu peux utiliser
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
);
à partir de la version 3.1 ( source )
selon dr. hipp dans un récent article de liste:
CREATE TABLE whatever(
....
timestamp DATE DEFAULT (datetime('now','localtime')),
...
);
C'est juste une erreur de syntaxe, vous avez besoin de parenthèses: (DATETIME('now'))
Si vous regardez documentation , vous remarquerez la parenthèse ajoutée autour de l'option "expr" dans la syntaxe.
Ceci est un exemple complet basé sur les autres réponses et commentaires à la question. Dans l'exemple, l'horodatage (colonne created_at
-) est enregistré sous le format Epoque unix fuseau horaire UTC et converti en fuseau horaire local uniquement lorsque cela est nécessaire.
Utiliser Unix Epoch permet d'économiser de l'espace de stockage - entier sur 4 octets vs chaîne sur 24 octets lorsqu'il est stocké sous forme de chaîne ISO8601, voir types de données . Si 4 octets ne suffisent pas, vous pouvez l'augmenter à 6 ou 8 octets.
L'enregistrement de l'horodatage sur le fuseau horaire UTC facilite l'affichage d'une valeur raisonnable sur plusieurs fuseaux horaires.
La version de SQLite est la version 3.8.6 fournie avec 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 est correct car je suis situé à UTC + 2 DST au moment de la requête.
Il peut être préférable d'utiliser le type REAL pour économiser de l'espace de stockage.
Citation de la section 1.2 de types de données dans SQLite version
SQLite n'a pas de classe de stockage réservée pour stocker des dates et/ou des heures. Au lieu de cela, les fonctions de date et d’heure intégrées de SQLite sont capables de stocker des dates et des heures sous forme de valeurs TEXT, REAL ou INTEGER
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t REAL DEFAULT (datetime('now', 'localtime'))
);
voir contrainte de colonne .
Et insert une ligne sans fournir de valeur.
INSERT INTO "test" DEFAULT VALUES;
C'est une erreur de syntaxe parce que vous n'avez pas écrit de parenthèse
si vous écrivez
Sélectionnez date-heure ('maintenant'), il vous donnera l'heure utc mais si vous écrivez cette requête, vous devez ajouter une parenthèse avant cette date (date/heure ('maintenant')) pour l'heure UTC. pour l'heure locale identique Sélectionnez date/heure ('maintenant', 'heure locale') pour la requête
(date/heure ('maintenant', 'heure locale'))
Cet exemple alternatif stocke l'heure locale sous forme de nombre entier pour enregistrer les 20 octets. Le travail est effectué dans les champs default, Update-trigger et View. strftime doit utiliser '% s' (guillemets simples) car "% s" (guillemets doubles) a généré une erreur "Pas constant" sur moi.
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