如何在SQLite中拥有自动时间戳?

Álv*_*cía 121 c# sqlite timestamp

我有一个SQLite数据库,版本3,我使用C#创建一个使用此数据库的应用程序.

我想在表中使用timestamp字段进行并发,但我注意到当我插入新记录时,此字段未设置,并且为null.

例如,在MS SQL Server中,如果我使用时间戳字段,这由数据库更新,我不必自己设置.这在SQLite中可能吗?

CL.*_*CL. 190

只需声明字段的默认值:

CREATE TABLE MyTable(
    ID INTEGER PRIMARY KEY,
    Name TEXT,
    Other STUFF,
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)

但是,如果您的INSERT命令显式设置此字段NULL,则将其设置为NULL.

  • @Matthieu没有'DATETIME`*数据*类型,但SQLite接受任何*field*类型. (22认同)
  • 我认为没有DATETIME字段类型:http://www.sqlite.org/datatype3.html (13认同)
  • 这与SQL Server的时间戳不完全相同,因为它基于系统时钟; 如果你改变时钟,价值可能会倒退.在SQL Server中,时间戳值始终递增. (5认同)
  • 这似乎不包括UPDATE语句.看起来触发器是执行此操作的唯一方法. (5认同)
  • @Matthieu在您提供的链接中,SQLite中提到了DATETIME数据类型.阅读2.2亲和力名称示例 (4认同)
  • @CL抱歉,你说得对.我错误地合并了你的答案和javed的.使用`DEFAULT(STRFTIME('%Y-%m-%d%H:%M:%f','NOW','localtime'))`一个实际上得到有意义的微秒值. (2认同)
  • “如果您的 INSERT 命令显式将此字段设置为 NULL,则它将被设置为 NULL”...在您对该字段设置非空约束之前,这是正确的。奇怪的是,这个约束导致 sqlite3 使用默认值。 (2认同)
  • 这是解释 CURRENT_TIMESTAMP 的文档的链接,也许对某人有用。https://www.sqlite.org/lang_createtable.html#the_default_clause 有趣的是 - 它不是一个函数,它只是一个关键字。https://www.sqlite.org/lang_keywords.html (2认同)

mr.*_*fox 66

您可以在SQLite上的表中创建TIMESTAMP字段,请参阅:

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');
Run Code Online (Sandbox Code Playgroud)

这是结果:

SELECT * FROM my_table;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • TIMESTAMP 不是 SQLite 中的真实类型。他们的类型关联文档使用 DATETIME。 (3认同)

小智 9

阅读datefunc自动日期时间完成的一个工作示例是:

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'))
   ...> );
Run Code Online (Sandbox Code Playgroud)

让我们以启动自动日期时间完成的方式插入一些行:

sqlite> INSERT INTO 'test' ('id') VALUES (null);
sqlite> INSERT INTO 'test' ('id') VALUES (null);
Run Code Online (Sandbox Code Playgroud)

存储的数据清楚地显示前两个是相同但不是第三个功能:

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
Run Code Online (Sandbox Code Playgroud)

注意SQLite函数包含在括号中!在一个例子中显示它有多困难?

玩得开心!


Rah*_*abi 7

您可以使用触发器。效果很好

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;
Run Code Online (Sandbox Code Playgroud)


Raf*_*ael 6

为了补充上面的答案......

如果您使用EF,请使用Data Annotation [Timestamp]装饰该属性,然后转到上下文类中的重写OnModelCreating,并添加此Fluent API代码:

modelBuilder.Entity<YourEntity>()
                .Property(b => b.Timestamp)
                .ValueGeneratedOnAddOrUpdate()
                .IsConcurrencyToken()
                .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");
Run Code Online (Sandbox Code Playgroud)

它将为将要插入此表的每个数据设置一个默认值.


Jav*_*ved 5

您可以使用自定义日期时间...

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

使用 'NOW','localtime' 获取当前系统日期,否则它将在数据库中插入时间后显示数据库中的过去或其他时间。

感谢您...

  • 如果您需要微秒,则很有用;您可以使用 DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW','localtime'))`。仅说 DEFAULT CURRENT_TIMESTAMP 只会给您一秒的粒度。 (2认同)