valeur de temps par défaut de la base de données sqlite 'now'
est-il possible dans une base de données sqlite de créer une table qui a une colonne timestamp par défaut à DATETIME('now')
?
comme ceci:
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT DATETIME('now')
);
Cela donne une erreur... Comment le résoudre?
6 réponses
selon le dr. hipp dans une liste récente de post:
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 la" documentation 151950920", vous noterez la parenthèse qui est ajoutée autour de l'option "expr" dans la syntaxe.
il s'agit d'un exemple complet basé sur les autres réponses et commentaires à la question. Dans l'exemple, le timestamp ( created_at
-colonne) est enregistré comme unix epoch UTC timezone et converti en local timezone seulement si nécessaire.
utilisant unix epoch sauve de l'espace de stockage - 4 octets entier par rapport à 24 octets chaîne lorsque stockée comme chaîne ISO8601, voir datatypes . Si 4 octets ne sont pas suffisants, cela peut être augmenté à 6 ou 8 octets.
Timestamp de sauvegarde sur le fuseau horaire UTC il est commode de montrer une valeur raisonnable sur les fuseaux horaires multiples.
version SQLite est 3.8.6 que les navires 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 réel, pour économiser de l'espace de stockage.
citation de la section 1.2 de types de données dans la Version SQLite 3
SQLite n'a pas de classe de stockage réservée pour stocker les dates et/ou de temps. À la place, les fonctions Date et heure intégrées de SQLite sont capables de stocker des dates et des heures sous forme de texte, réel, ou entier valeurs
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t REAL DEFAULT (datetime('now', 'localtime'))
);
voir colonne-contrainte .
et insérer une ligne sans fournir de valeur.
INSERT INTO "test" DEFAULT VALUES;
c'est une erreur de syntaxe parce que vous n'avez pas écrit la parenthèse
si vous écrivez
sélectionnez datetime ('now')) ensuite, il vous donnera le temps utc mais si vous ceci écrivez la requête alors vous devez ajouter la parenthèse avant ceci (datetime('now')) pour l'Heure UTC. pour heure locale même Sélectionnez datetime ('now', 'localtime')) Pour requête
(datetime ('now','localtime'))