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?

154
demandé sur Alex 2008-10-14 11:56:27

6 réponses

je crois que vous pouvez utiliser

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

dans la version 3.1 ( source )

241
répondu Owen 2008-10-14 08:01:44

selon le dr. hipp dans une liste récente de post:

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);
79
répondu rev 2008-10-23 00:44:24

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.

31
répondu Adam Luter 2009-04-15 22:47:15

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.

11
répondu user272735 2014-09-30 17:52:54

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;
5
répondu Nianliang 2013-11-21 12:59:04

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

4
répondu Sandeep 2013-04-26 06:50:56