[C#] SQLite에서 자동 타임 스탬프를 얻는 방법은 무엇입니까?

SQLite 데이터베이스 버전 3이 있고 C #을 사용하여이 데이터베이스를 사용하는 응용 프로그램을 만들고 있습니다.

동시성에 대해 테이블에 타임 스탬프 필드를 사용하고 싶지만 새 레코드를 삽입 할 때이 필드가 설정되지 않고 null 인 것을 알 수 있습니다.

예를 들어, MS SQL Server에서 타임 스탬프 필드를 사용하면 데이터베이스에 의해 업데이트되므로 직접 설정하지 않아도됩니다. SQLite에서 가능합니까?



답변

필드의 기본값을 선언하십시오.

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

그러나 INSERT명령에서이 필드를 명시 적으로로 설정하면이 필드 NULL가로 설정됩니다 NULL.


답변

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;

여기에 이미지 설명을 입력하십시오


답변

자동 datetime 완료의 실제 예제 인 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 함수는 괄호로 묶여 있습니다! 이것이 하나의 예에서 보여주기가 얼마나 어려웠습니까?

즐기세요!


답변

트리거를 사용할 수 있습니다. 잘 작동합니다

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;


답변

위의 답변을 보완하려면 …

EF를 사용하는 경우 Data Annotation [Timestamp]로 속성을 장식 한 다음 컨텍스트 클래스 내에서 재정의 된 OnModelCreating으로 이동하여이 Fluent API 코드를 추가하십시오.

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

이 테이블에 삽입 될 모든 데이터에 기본값을 설정합니다.


답변

당신은 사용하여 사용자 정의 날짜 시간을 사용할 수 있습니다 …

 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’을 사용하십시오. 그렇지 않으면 데이터베이스에 삽입 시간이 지난 후 데이터베이스에 과거 또는 다른 시간이 표시됩니다.

감사합니다…


답변

SQLite DB-Browser를 사용하는 경우 다음과 같은 방법으로 기본값을 변경할 수 있습니다.

  1. 데이터베이스 구조를 선택하십시오
  2. 테이블을 선택
  3. 테이블 수정
  4. 열에서 ‘default value’아래에 값을 넣으십시오 : = (datetime ( ‘now’, ‘localtime’))

값의 형식이 잘못되면 SQLLite 브라우저에 문제가 발생할 수 있으므로 데이터베이스를 업데이트하는 것이 좋습니다.