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

gpfsuwkq  于 2023-01-02  发布在  SQLite
关注(0)|答案(7)|浏览(209)

我有一个SQLite数据库,版本3,我正在使用C#创建一个使用此数据库的应用程序。
我想在表中使用时间戳字段来实现并发,但是我注意到当我插入一条新记录时,这个字段没有设置,而是空的。
例如,在MS SQL Server中,如果我使用时间戳字段,它会由数据库更新,我不必自己设置它。这在SQLite中可能吗?

yebdmbv4

yebdmbv41#

只需为字段声明一个默认值:

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

但是,如果INSERT命令将此字段显式设置为NULL,则它将被设置为NULL

1tu0hz3e

1tu0hz3e2#

您可以在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');

这就是结果:

SELECT * FROM my_table;

njthzxwz

njthzxwz3#

读取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'))
   ...> );

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

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

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

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

注意SQLite函数是用圆括号括起来的!在一个例子中显示它有多困难?
好好玩!

vwkv1x7d

vwkv1x7d4#

你可以使用触发器,效果很好

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;
omjgkv6w

omjgkv6w5#

为了补充上述答案...
如果您使用的是EF,请使用Data Annotation [Timestamp]修饰属性,然后转到上下文类中被覆盖的OnModelCreating,并添加以下Fluent API代码:

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

它将为要插入到该表中每个数据设置默认值。

hpxqektj

hpxqektj6#

您可以使用自定义日期时间,方法是使用...

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

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

suzh9iv8

suzh9iv87#

如果使用SQLite数据库浏览器,则可以通过以下方式更改默认值:
1.选择数据库结构
1.选择表格
1.修改表
1.在您的列中,将值置于“默认值”下:***=(日期时间(“现在”,“本地时间”))***
我建议您在更新数据库之前,因为错误的值格式可能会导致SQLLite浏览器出现问题。

相关问题