2008-10-14 7 views
142

¿Es posible en una base de datos sqlite crear una tabla que tenga una columna de marca de tiempo predeterminada en DATETIME('now')?valor de tiempo predeterminado de la base de datos sqlite 'ahora'

De esta manera:

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

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

Respuesta

222

Creo que se puede utilizar

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

partir de la versión 3,1 (source)

+13

Si le preocupa el tamaño de almacenamiento, tenga en cuenta que esta receta guardará sus marcas de tiempo en ISO-8601 (un formato de texto), ocupando aproximadamente 24 bytes en la base de datos por fecha.Puede ahorrar espacio simplemente usando una columna INTEGER (4) y almacenando el tiempo de Unix mediante "INSERT INTO test (t) values ​​(strftime ("% s ", CURRENT_TIME));" – mckoss

+2

@mckoss gracias a su comentario, la declaración de creación se convirtió en: ... mycolumn default (strftime ('% s', 'now')) – larham1

+1

"... predeterminado (strftime ('% s', 'now')) "no es una expresión constante, no funcionará con la entrega predeterminada" Error: el valor predeterminado de la columna [...] no es constante ". –

71

según el doctor. hipp en un post reciente lista:

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

gracias - Me preguntaba cómo crear una marca de tiempo predeterminada con hora local en lugar de UTC – hoju

+0

Metoo, gracias por el parámetro de hora loca – pihentagy

+0

¡Muchas gracias! No estaba satisfecho con el formato de 'CURRENT_TIMESTAMP' así que creé mi propia función en C para devolver el número de microsegundos desde la Época, y me alegro de poder usar eso como un 'DEFAULT' ahora. – Michael

31

Es sólo un error de sintaxis, es necesario paréntesis: (DATETIME('now'))

Si nos fijamos en la documentation, se le nota el paréntesis que se añade todo el 'expr' opción en la sintaxis

3

Es error de sintaxis, porque usted no escribió paréntesis

si se escribe

Select datetime('now') then it will give you utc time but if you this write it query then you must add parenthesis before this so (datetime('now')) for UTC Time. for local time same Select datetime('now','localtime') for query

(fecha y hora ('ahora', 'localtime'))

3

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

Presupuesto de 1,2 sección de Datatypes In SQLite Version 3

SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values

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

ver column-constraint.

Y insert sin proporcionar ningún valor.

INSERT INTO "test" DEFAULT VALUES; 
+0

Prefiero 'entero (n)' donde uno puede elegir el valor adecuado para 'n'. – user272735

9

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 se convierte a la zona horaria local solo cuando es necesario.

El uso de Unix epoch ahorra espacio de almacenamiento - 4 bytes enteros contra cadena de 24 bytes cuando se almacenan como cadenas ISO8601, consulte datatypes. Si 4 bytes no son suficientes, se puede aumentar a 6 u 8 bytes.

La marca de tiempo de ahorro en la zona horaria UTC hace que sea conveniente mostrar un valor razonable en varias zonas horarias.

La versión de SQLite es 3.8.6 que se envía 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 correcta Estoy ubicado en el horario de verano UTC + 2 en el momento de la consulta.

Cuestiones relacionadas