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


132

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

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

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

답변:


212

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

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

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


5
이는 시스템 시계를 기반으로하기 때문에 SQL Server의 타임 스탬프와는 상당히 다릅니다. 시계를 변경하면 값이 거꾸로 갈 수 있습니다. SQL Server에서 타임 스탬프 값은 항상 증가합니다.
Rory MacLeod

26
@Matthieu DATETIME 데이터 형식은 없지만 SQLite는 필드 형식으로 아무것도 허용 합니다.
CL.

4
@Matthieu u가 제공 한 링크에 SQLite에 언급 된 DATETIME 데이터 유형이 있습니다. 2.2 선호도 이름 예제 읽기
Rafique Mohammed

6
이것은 UPDATE 문을 다루지 않는 것 같습니다. 트리거가이 작업을 수행하는 유일한 방법 인 것 같습니다.
데일 앤더슨

2
@CL 죄송합니다. 맞습니다. 귀하의 답변과 javed를 잘못 병합했습니다. 로 DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime'))하나 실제로 의미있는 마이크로 값을 가져옵니다.
Dietmar

71

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;

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


기본값이 일정하지 않은 열을 추가 할 수 없습니다 (ALTER TABLE "main". "xxx_data"ADD COLUMN "created_date"TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)
toing_toing

14

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

즐기세요!


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;

6

위의 답변을 보완하려면 ...

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

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

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


Xamarin 앱에서 Entity가 Android에서 어떻게 수행되는지 알고 있습니까? DAL을 대체하는 것이 좋지만 테스트를받지 못했습니다.
samis

sqliteHasDefault에 필요한 패키지를 찾지 못했습니다. 너겟에서 어떤 패키지를 가져와야하는지 알아?
Simons0n

@ Simons0n,이 Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder 네임 스페이스를 사용해보십시오.
Rafael

2

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

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

감사합니다...


1
마이크로 초가 필요한 경우에 유용합니다. DEFAULT (STRFTIME ( '% Y- % m- % d % H : % M : % f', 'NOW', 'localtime'))`를 사용할 수 있습니다. DEFAULT CURRENT_TIMESTAMP라고 말하면 1 초의 세분성 만 제공합니다.
Dietmar

이것은 확실히 작동합니다! 괄호로 묶인 strftime ()에주의하십시오!
centurian

0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.