Làm thế nào để có dấu thời gian tự động trong SQLite?


132

Tôi có cơ sở dữ liệu SQLite, phiên bản 3 và tôi đang sử dụng C # để tạo một ứng dụng sử dụng cơ sở dữ liệu này.

Tôi muốn sử dụng trường dấu thời gian trong bảng để đồng thời, nhưng tôi nhận thấy rằng khi tôi chèn một bản ghi mới, trường này không được đặt và không có giá trị.

Ví dụ: trong MS SQL Server nếu tôi sử dụng trường dấu thời gian thì cơ sở dữ liệu này được cập nhật, tôi không phải tự thiết lập. điều này có thể có trong SQLite không?

Câu trả lời:


212

Chỉ cần khai báo một giá trị mặc định cho một trường:

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

Tuy nhiên, nếu INSERTlệnh của bạn đặt trường này thành rõ ràng NULL, nó sẽ được đặt thành NULL.


5
Điều đó không hoàn toàn tương đương với dấu thời gian của SQL Server vì nó dựa trên đồng hồ hệ thống; nếu bạn thay đổi đồng hồ, giá trị có thể quay ngược. Trong SQL Server, các giá trị dấu thời gian luôn tăng.
Rory MacLeod

26
@Matthieu Không có kiểu DATETIME dữ liệu , nhưng SQLite chấp nhận mọi thứ là kiểu trường .
CL.

4
@Matthieu Có kiểu dữ liệu DATETIME được đề cập trong SQLite trong liên kết mà bạn đã cung cấp. Đọc 2.2 Ví dụ về tên mối quan hệ
Rafique Mohammed

6
Điều này dường như không bao gồm các báo cáo CẬP NHẬT. Có vẻ như một kích hoạt là cách duy nhất để làm điều này.
Dale Anderson

2
@CL Xin lỗi, bạn nói đúng. Tôi kết hợp không chính xác câu trả lời của bạn và nói đùa. Với DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime'))một thực sự có được giá trị micro giây có ý nghĩa.
Dietmar

71

Bạn có thể tạo trường TIMESTAMP trong bảng trên SQLite, xem điều này:

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');

Đây là kết quả:

SELECT * FROM my_table;

nhập mô tả hình ảnh ở đây


Không thể thêm một cột với mặc định không đổi (ALTER TABLE "chính" "xxx_data" ADD COLUMN "CREATED_DATE" dấu thời gian NOT NULL DEFAULT CURRENT_TIMESTAMP.)
toing_toing

14

Đọc datefunc một ví dụ hoạt động về hoàn thành datetime tự động sẽ là:

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

Hãy chèn một số hàng theo cách bắt đầu hoàn thành datetime tự động:

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

Dữ liệu được lưu trữ rõ ràng cho thấy hai cái đầu giống nhau nhưng không phải là hàm thứ ba:

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

Hãy chú ý rằng các hàm SQLite được bao quanh trong ngoặc đơn! Làm thế nào khó khăn để hiển thị nó trong một ví dụ?

Chúc vui vẻ!


7

bạn có thể sử dụng kích hoạt. hoạt động rất tốt

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;

6

Để bổ sung cho câu trả lời ở trên ...

Nếu bạn đang sử dụng EF, hãy tô điểm cho thuộc tính bằng Chú thích dữ liệu [Dấu thời gian], sau đó đi đến OnModelCreating được ghi đè, bên trong lớp ngữ cảnh của bạn và thêm mã API Fluent này:

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

Nó sẽ tạo một giá trị mặc định cho mọi dữ liệu sẽ được chèn vào bảng này.


Biết cách Entity hoạt động trên Android, trong ứng dụng Xamarin? Không được thử nghiệm, mặc dù sẽ rất tốt nếu thay thế DAL.
samis

Tôi không tìm thấy gói cần thiết cho sqliteHasDefault. Bạn biết gói nào tôi phải nhận từ nuget?
Simons0n

@ Simons0n, hãy thử sử dụng không gian tên Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder này.
Rafael

2

bạn có thể sử dụng datetime tùy chỉnh bằng cách sử dụng ...

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

sử dụng 'NOW', 'localtime' để lấy ngày hiện tại của hệ thống, nó sẽ hiển thị một số quá khứ hoặc thời gian khác trong Cơ sở dữ liệu của bạn sau thời gian chèn vào db của bạn.

Cảm ơn bạn...


1
Hữu ích nếu bạn cần micro giây; bạn có thể sử dụng DEFAULT (STRFTIME ('% Y-% m-% d% H:% M:% f', 'NOW', 'localtime')) `. Chỉ cần nói DEFAULT CURRENT_TIMESTAMP sẽ chỉ cung cấp cho bạn mức độ chi tiết của một giây.
Dietmar

Điều này chắc chắn hoạt động! chú ý đến strftime () như được bao quanh bằng dấu ngoặc đơn!
centurian

0

Nếu bạn sử dụng SQLite DB-Browser, bạn có thể thay đổi giá trị mặc định theo cách này:

  1. Chọn cấu trúc cơ sở dữ liệu
  2. chọn bảng
  3. sửa đổi bảng
  4. trong cột của bạn đặt dưới 'giá trị mặc định' giá trị: = (datetime ('now', 'localtime'))

Tôi khuyên bạn nên thực hiện cập nhật cơ sở dữ liệu của mình trước đây, vì định dạng sai trong giá trị có thể dẫn đến các sự cố trong Trình duyệt SQLLite.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.