Est-il possible dans une base de données sqlite de créer une table qui a une colonne d'horodatage par défaut DATETIME('now')
?
Comme ça:
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT DATETIME('now')
);
Cela donne une erreur ... Comment résoudre?
selon dr. hipp dans un article de liste récent:
la source
CURRENT_TIMESTAMP
, j'ai donc créé ma propre fonction en C pour renvoyer le nombre de microsecondes depuis l'Epoch, et je suis heureux de pouvoir l'utiliserDEFAULT
maintenant.C'est juste une erreur de syntaxe, vous avez besoin de parenthèses:
(DATETIME('now'))
Si vous regardez la documentation , vous noterez la parenthèse qui est ajoutée autour de l'option 'expr' dans la syntaxe.
la source
Ceci est un exemple complet basé sur les autres réponses et commentaires à la question. Dans l'exemple, l'horodatage (
created_at
-column) est enregistré en tant que fuseau horaire UTC de l' époque Unix et converti en fuseau horaire local uniquement lorsque cela est nécessaire.L'utilisation d'unix epoch permet d'économiser de l'espace de stockage - 4 octets entier contre 24 octets de chaîne lorsqu'il est stocké en tant que chaîne ISO8601, voir types de données . Si 4 octets ne suffisent pas, cela peut être augmenté à 6 ou 8 octets.
L'enregistrement de l'horodatage sur le fuseau horaire UTC permet d'afficher une valeur raisonnable sur plusieurs fuseaux horaires.
La version de SQLite est 3.8.6 livrée avec Ubuntu LTS 14.04.
L'heure locale est correcte car je suis situé à UTC + 2 DST au moment de la requête.
la source
Il peut être préférable d'utiliser le type REAL pour économiser de l'espace de stockage.
Citation de la section 1.2 des types de données dans SQLite version 3
voir la contrainte de colonne .
Et insérez une ligne sans fournir de valeur.
la source
integer(n)
où l'on peut choisir la valeur appropriéen
.C'est une erreur de syntaxe car vous n'avez pas écrit de parenthèses
si tu écris
(datetime ('maintenant', 'heure locale'))
la source
Cet exemple alternatif stocke l'heure locale en tant qu'Integer pour enregistrer les 20 octets. Le travail est effectué dans le champ par défaut, Update-trigger et View. strftime doit utiliser '% s' (guillemets simples) car "% s" (guillemets doubles) m'a renvoyé une erreur 'Not Constant'.
la source