HOWTO · SQLite
SQLite의 자동 타임스탬프
이 기사에서는 SQLite에서 자동 타임스탬프를 얻는 방법에 대해 설명합니다.
이 페이지의 내용
INSERT에서 해당 열을 생략하면 DEFAULT CURRENT_TIMESTAMP로 선언한 열에 생성 시각을 자동으로 기록할 수 있습니다. 열에 명시적으로 NULL을 지정하면 기본값은 적용되지 않으며, NOT NULL 제약 조건이 있으면 해당 INSERT는 실패합니다. SQLite에는 전용 날짜/시간 저장 클래스가 없으므로 TEXT, INTEGER 또는 REAL 중 하나를 골라 일관되게 사용하세요. Python의 sqlite3는 변환을 설정한 경우에만 값을 datetime 객체로 반환합니다.
SQLite 테이블에 타임스탬프 자동 추가하기
예를 들어 타임스탬프 열을 DEFAULT CURRENT_TIMESTAMP로 선언할 수 있습니다. CREATE TABLE events (id INTEGER PRIMARY KEY, name TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP);처럼 테이블을 만들고 INSERT INTO events (name) VALUES ('launch');를 실행하면 created_at을 생략했으므로 SQLite가 기본값을 사용합니다. INSERT에서 created_at을 명시하고 NULL을 지정하면 기본값은 호출되지 않으며 NOT NULL 제약 조건 때문에 INSERT가 거부됩니다. 이후 쿼리에서도 SELECT id, name, created_at FROM events;처럼 같은 테이블과 열 이름을 사용하세요.
CURRENT_TIMESTAMP는 현재 UTC 날짜와 시각을 YYYY-MM-DD HH:MM:SS 형식의 텍스트로 제공하는 SQLite 키워드입니다. 기본값은 새로 삽입된 행에 적용되며 다른 열을 UPDATE할 때 자동으로 바뀌지 않습니다. 수정 시각이 필요하면 UPDATE 문에서 직접 지정하거나 해당 동작을 위한 트리거를 사용하세요.
SQLite에서 날짜와 시간 표현 방식 선택하기
SQLite 값은 TEXT, INTEGER, REAL 저장 클래스를 사용하며, NULL과 BLOB도 있습니다. DATETIME이나 TIMESTAMP 같은 선언 이름을 사용해도 기본 날짜/시간 저장 유형이 만들어지는 것은 아닙니다. 값의 저장 방식에는 SQLite의 타입 선호도 규칙이 적용되므로 하나의 표현 방식을 정해 일관되게 사용하세요.
텍스트는 읽기 쉬우며, 가장 큰 날짜 단위부터 작은 단위 순서로 표현하는 YYYY-MM-DD HH:MM:SS.SSS 같은 형식에 적합합니다. 정수에는 Unix 시간을 초 단위로 저장할 수 있고, 실수에는 율리우스 날짜 값을 저장할 수 있습니다. SQLite의 날짜/시간 함수는 이러한 표현을 해석할 수 있습니다. DATE_ADD와 UNIX_TIMESTAMP는 SQLite 함수가 아닙니다. 지원되는 변환에는 SQLite의 date(), time(), datetime() 함수를 사용하세요.
SQLite 타임스탬프를 Python datetime 객체로 가져오기
sqlite3 모듈은 일반적인 SQLite 값을 저장 클래스에 대응하는 Python 값으로 반환합니다. 타임스탬프처럼 보이는 문자열도 보통 str로 반환됩니다. Python datetime 객체로 가져오려면 변환기를 등록하고 선언된 유형을 파싱하도록 설정하세요. 다음 독립 실행형 예제는 메모리 데이터베이스를 만들고 고정된 타임스탬프를 삽입한 뒤 변환된 값과 그 유형을 출력합니다.
이 예제는 변환을 설정해 쿼리 결과의 타임스탬프가 Python datetime 객체로 반환되도록 보여 줍니다:
import datetime
import sqlite3
def convert_timestamp(raw_value):
return datetime.datetime.fromisoformat(raw_value.decode("utf-8"))
sqlite3.register_converter("timestamp", convert_timestamp)
connection = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
connection.execute("CREATE TABLE events (created_at TIMESTAMP NOT NULL)")
connection.execute("INSERT INTO events VALUES (?)", ("2024-02-03 04:05:06",))
created_at = connection.execute("SELECT created_at FROM events").fetchone()[0]
print(created_at.isoformat(sep=" "))
print(type(created_at).__name__)
connection.close()
2024-02-03 04:05:06
datetime
변환은 연결에 설정하는 Python 측 동작입니다. SQLite 자체는 여전히 자체 저장 규칙에 따라 값을 저장합니다. 변환기를 등록하지 않았거나 파싱을 활성화하지 않았다면 값을 텍스트로 조회한 다음 필요할 때 애플리케이션 코드에서 파싱하세요.
SQLite에서 Unix 타임스탬프를 날짜와 시각으로 변환하기
정수 Unix 타임스탬프와 unixepoch 수정자를 SQLite 날짜/시간 함수에 전달하세요. 고정된 값인 datetime(1793956207, 'unixepoch')은 날짜와 시각을 반환하고, date(1793956207, 'unixepoch')는 날짜를, time(1793956207, 'unixepoch')는 하루 중 시각을 반환합니다. 세 표현식은 같은 순간을 사용하며 반환하는 부분만 다릅니다. 현재 시각을 사용하는 표현식은 평가 시점에 따라 달라지므로, 반복 가능한 예제가 필요하면 고정 입력값을 사용하세요.
날짜와 시각 값을 텍스트로 저장하기
2019-02-02 11:21:08.321 같은 텍스트 표현은 YYYY-MM-DD HH:MM:SS.SSS 패턴을 따릅니다. 이는 SQLite의 TEXT 저장 클래스에 담기는 형식 규칙이지, 특별한 날짜/시간 유형이 아닙니다. 각 행에서 형식, 정밀도, 시간대 규칙을 일관되게 유지하세요. 날짜의 큰 단위를 앞에 두는 형식을 일관되게 사용하면 텍스트를 사전식으로 비교해 시간 순서를 정할 수 있습니다. 형식이나 시간대 규칙이 섞이면 텍스트 비교 결과가 잘못된 순서를 나타낼 수 있습니다.