valeur temporelle par défaut de la base de données sqlite 'maintenant'

StackOverflow https://stackoverflow.com/questions/200309

  •  03-07-2019
  •  | 
  •  

Question

Est-il possible dans une base de données sqlite de créer une table contenant une colonne d'horodatage dont la valeur par défaut est DATETIME ('maintenant') ?

Comme ceci:

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

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

Était-ce utile?

La solution

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 )

Autres conseils

selon dr. hipp dans une liste récente:

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

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

Si vous consultez la documentation , vous remarquerez la parenthèse qui est ajouté 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 ( created_at -column) est enregistré sous le nom d'époque unix Fuseau horaire UTC et converti en fuseau horaire local uniquement si nécessaire.

L’époque unix permet d’économiser de l’espace de stockage - 4 octets au lieu de 24 octets sous la forme de chaîne ISO8601, voir types de données . Si 4 octets ne suffisent pas, vous pouvez l'augmenter à 6 ou 8 octets.

La sauvegarde de l'horodatage sur le fuseau horaire UTC facilite l'affichage d'une valeur raisonnable sur plusieurs fuseaux horaires.

La version de SQLite est 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

L'heure locale est correcte, car je suis situé à l'heure 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 3

  

SQLite n'a pas de classe de stockage réservée pour le stockage des dates   et / ou fois. À la place, les fonctions de date et d’heure intégrées de SQLite   sont capables de stocker des dates et des heures en tant que 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 de valeur.

INSERT INTO "test" DEFAULT VALUES;

C’est une erreur de syntaxe car vous n’avez pas écrit de parenthèse

si vous écrivez

  

Sélectionnez date / heure ('maintenant')   alors il vous donnera le temps utc mais si vous écrivez cette requête, vous devez ajouter une parenthèse avant cette   so (date / heure ('maintenant')) pour l'heure UTC.   pour l'heure locale même   Sélectionnez datetime ('now', 'localtime')   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 " (doubles guillemets) a lancé 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top