valor de tiempo predeterminado de la base de datos sqlite 'ahora'
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?
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