Cómo tener una marca de tiempo automática en SQLite?


Tengo una base de datos SQLite, versión 3 y estoy usando C# para crear una aplicación que use esta base de datos.

Quiero usar un campo de marca de tiempo en una tabla para la concurrencia, pero noto que cuando inserto un nuevo registro, este campo no está establecido y es nulo.

Por ejemplo, en MS SQL Server si utilizo un campo de marca de tiempo que es actualizado por la base de datos, no tengo que configurarlo yo mismo. es esto posible en SQLite?

Author: Fraser, 2013-01-22

6 answers

Simplemente declare un valor predeterminado para un campo:

CREATE TABLE MyTable(
    ID INTEGER PRIMARY KEY,
    Name TEXT,
    Other STUFF,
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

Sin embargo, si su comando INSERT establece explícitamente este campo en NULL, se establecerá en NULL.

 164
Author: CL.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 00:45:04

Puede crear un campo de marca de tiempo en la tabla en el SQLite, vea esto:

CREATE TABLE my_table (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name VARCHAR(64),
    sqltime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

INSERT INTO my_table(name, sqltime) VALUES('test1', '2010-05-28T15:36:56.200');
INSERT INTO my_table(name, sqltime) VALUES('test2', '2010-08-28T13:40:02.200');
INSERT INTO my_table(name) VALUES('test3');

Este es el resultado:

SELECT * FROM my_table;

introduzca la descripción de la imagen aquí

 60
Author: mr.boyfox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-07 17:16:49

Leyendo datefunc un ejemplo de trabajo de finalización automática de datetime sería:

sqlite> CREATE TABLE 'test' ( 
   ...>    'id' INTEGER PRIMARY KEY,
   ...>    'dt1' DATETIME NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')), 
   ...>    'dt2' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')), 
   ...>    'dt3' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime'))
   ...> );

Vamos a insertar algunas filas de una manera que inicia la finalización automática de la fecha y hora:

sqlite> INSERT INTO 'test' ('id') VALUES (null);
sqlite> INSERT INTO 'test' ('id') VALUES (null);

Los datos almacenados muestran claramente que los dos primeros son los mismos pero no la tercera función:

sqlite> SELECT * FROM 'test';
1|2017-09-26 09:10:08|2017-09-26 09:10:08|2017-09-26 09:10:08.053
2|2017-09-26 09:10:56|2017-09-26 09:10:56|2017-09-26 09:10:56.894

Preste atención a que las funciones SQLite están rodeadas entre paréntesis! ¿Cuán difícil fue mostrarlo en un ejemplo?

Diviértete!

 7
Author: centurian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-26 06:17:33

Para complementar las respuestas anteriores...

Si está utilizando EF, adorne la propiedad con una anotación de datos [Timestamp], entonces vaya a la OnModelCreating anulada, dentro de su clase context, y agregue este código API fluido:

modelBuilder.Entity<YourEntity>()
                .Property(b => b.Timestamp)
                .ValueGeneratedOnAddOrUpdate()
                .IsConcurrencyToken()
                .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");

Hará un valor predeterminado para cada dato que se insertará en esta tabla.

 3
Author: Rafael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-05 18:44:03

Puede usar la fecha y hora personalizada usando...

 create table noteTable3 
 (created_at DATETIME DEFAULT (STRFTIME('%d-%m-%Y   %H:%M', 'NOW','localtime')),
 title text not null, myNotes text not null);

Use 'NOW','localtime' para obtener la fecha actual del sistema, de lo contrario, mostrará algún tiempo pasado u otro en su base de datos después del tiempo de inserción en su base de datos.

Gracias...

 2
Author: Javed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-20 06:44:18

Puede usar disparadores. funciona muy bien

CREATE TABLE MyTable(
ID INTEGER PRIMARY KEY,
Name TEXT,
Other STUFF,
Timestamp DATETIME);


CREATE TRIGGER insert_Timestamp_Trigger
AFTER INSERT ON MyTable
BEGIN
   UPDATE MyTable SET Timestamp =STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

CREATE TRIGGER update_Timestamp_Trigger
AFTER UPDATE On MyTable
BEGIN
   UPDATE MyTable SET Timestamp = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;
 0
Author: Rahmat Anjirabi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-30 12:44:24