Pregunta

¿Es posible en una base de datos sqlite crear una tabla que tenga una columna de fecha y hora predeterminada a DATETIME ('now') ?

Me gusta esto:

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

Esto da un error ... ¿Cómo resolverlo?

¿Fue útil?

Solución

creo que puedes usar

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

a partir de la versión 3.1 ( fuente )

Otros consejos

según el dr. hipp en una publicación reciente de la lista:

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

Es solo un error de sintaxis, necesitas paréntesis: (DATETIME('now'))

Si observa la documentación , observará el paréntesis de se agrega alrededor de la opción 'expr' en la sintaxis.

Este es un ejemplo completo basado en las otras respuestas y comentarios a la pregunta. En el ejemplo, la marca de tiempo ( created_at -column) se guarda como unix epoch Zona horaria UTC y convertida a zona horaria local solo cuando sea necesario.

El uso de unix epoch ahorra espacio de almacenamiento: 4 bytes enteros frente a 24 bytes en cadena cuando se almacena como cadena ISO8601, consulte tipos de datos . Si 4 bytes no es suficiente, se puede aumentar a 6 u 8 bytes.

Guardar la marca de tiempo en la zona horaria UTC hace que sea conveniente mostrar un valor razonable en múltiples zonas horarias.

La versión de SQLite es 3.8.6 que viene con 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 es correcto ya que estoy ubicado en UTC + 2 DST en el momento de la consulta.

Puede ser mejor usar el tipo REAL, para ahorrar espacio de almacenamiento.

Cita de la sección 1.2 de Tipos de datos en SQLite versión 3

  

SQLite no tiene una clase de almacenamiento aparte para almacenar fechas   y / o tiempos. En cambio, las funciones incorporadas de fecha y hora de SQLite   son capaces de almacenar fechas y horas como TEXTO, REAL o INTEGER   valores

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

vea restricción de columna .

Y inserte una fila sin proporcionar ningún valor.

INSERT INTO "test" DEFAULT VALUES;

Es un error de sintaxis porque no escribió el paréntesis

si escribes

  

Seleccionar fecha y hora ('ahora')   entonces le dará tiempo de utc, pero si esta consulta lo escribe, debe agregar paréntesis antes de esto   así (fecha y hora ('ahora')) para la hora UTC.   mismo tiempo local   Seleccione fecha y hora ('ahora', 'hora local')   para consulta

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

Este ejemplo alternativo almacena la hora local como Entero para guardar los 20 bytes. El trabajo se realiza en el campo predeterminado, Activar actualización y Ver. strftime debe usar '% s' (comillas simples) porque "% s " (comillas dobles) me lanzó un error "No constante".

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top