218 votes

valeur par défaut de l'heure de la base de données sqlite 'now'.

Est-il possible dans une base de données sqlite de craete une table qui a une colonne timestamp qui a la valeur par défaut de DATETIME('now') ?

Comme ça :

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

Cela donne une erreur... Comment la résoudre ?

331voto

Owen Points 36009

Je crois que vous pouvez utiliser

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

à partir de la version 3.1 ( source )

25 votes

Si la taille du stockage vous préoccupe, notez que cette recette enregistrera vos horodatages en ISO-8601 (un format texte), ce qui occupera environ 24 octets par date dans la base de données. Vous pouvez gagner de la place en utilisant simplement une colonne INTEGER(4), et en stockant l'heure unix via "INSERT INTO test (t) values (strftime("%s", CURRENT_TIME)) ;".

6 votes

@mckoss grâce à votre commentaire, l'instruction create est devenue : ... mycolumn default (strftime('%s','now'))

2 votes

"... default (strftime('%s', 'now'))" n'est pas une expression constante, ne fonctionnera pas avec default donnant "Error : default value of column [...] is not constant".

111voto

rev Points 706

Selon le Dr Hipp dans un récent billet de liste :

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

0 votes

Merci beaucoup ! Je n'étais pas satisfait du format de CURRENT_TIMESTAMP J'ai donc créé ma propre fonction en C pour renvoyer le nombre de microsecondes depuis l'époque, et je suis heureux de pouvoir l'utiliser comme une DEFAULT maintenant.

2 votes

Y a-t-il une raison pour que 'localtime' ? Vous déplacez le serveur/ordinateur/toaster trop loin à l'est ou à l'ouest, et kaboom fait disparaître votre code.

59voto

Adam Luter Points 1043

C'est juste une erreur de syntaxe, vous avez besoin de parenthèses : (DATETIME('now'))

Si vous regardez le documentation Vous remarquerez que des parenthèses sont ajoutées autour de l'option "expr" dans la syntaxe.

10voto

Nianliang Points 574

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 3

SQLite ne dispose pas d'une classe de stockage réservée au stockage des dates et/ou les heures. Au lieu de cela, les fonctions intégrées de date et d'heure de SQLite sont capables de stocker les dates et les heures sous forme de valeurs TEXT, REAL, ou INTEGER valeurs

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

voir Contrainte de colonne .

Et insérer une ligne sans fournir aucune valeur.

INSERT INTO "test" DEFAULT VALUES;

1 votes

Je préfère integer(n) où l'on peut choisir la valeur appropriée pour n .

5voto

Sandeep Points 41

C'est une erreur de syntaxe parce que vous n'avez pas écrit de parenthèses.

si vous écrivez

Sélectionnez datetime('now') alors il vous donnera l'heure utc mais si vous écrivez cette requête alors vous devez ajouter des parenthèses avant ceci donc (datetime('now')) pour l'heure UTC. pour l'heure locale même chose Sélectionnez datetime('now', 'localtime') pour la requête

(datetime('now', 'localtime'))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X