C.W.K.
Stream
Lesson 08 of 10 · published

날짜, Boolean, 실용 타입

~14 min · schema, dates, boolean, types

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

SQLite 에 없는 두 타입

SQLite 엔 native DATE/DATETIME 타입이 없고 native BOOLEAN 도 없어. 둘 다 기존 타입 위 컨벤션. 날짜에 viable 한 3 가지:

  • ISO 8601 TEXT'2026-05-03 12:00:00'. 사람이 읽기 좋음, text 로도 정렬 정확, 모든 SQLite 날짜 함수가 지원. 권장 default.
  • Unix epoch INTEGER — 1970 이후 초. 컴팩트, 비교 빠름, 어떤 언어에서도 다루기 쉬움. 대규모 numeric range 필터링 필요할 때.
  • Julian Day REAL — 천문학 컨벤션. 앱 코드 입장에선 거의 옳은 선택 아님.

Boolean 은 SQLite 가 0/1 을 integer 로 저장하고 TRUE/FALSE literal 받아 (1/0 으로 컴파일). 어디서나 보임: archived INTEGER NOT NULL DEFAULT 0.

Tip: 피파의 conversations 테이블이 created_at/updated_at 에 ISO 8601 text 쓰는 이유 — JSONL ground truth 도 ISO 8601 이기 때문. 둘이 byte 비교 가능, purge-and-replay 재구성 단순.

Code

중요한 날짜 함수·sql
SELECT datetime('now');                       -- 2026-05-03 12:00:00
SELECT date('now');                           -- 2026-05-03
SELECT strftime('%Y-%m-%dT%H:%M:%fZ', 'now'); -- 2026-05-03T12:00:00.000Z
SELECT unixepoch('now');                       -- 1747900800

-- 포맷 간 비교
SELECT datetime(unixepoch('now'), 'unixepoch'); -- text 로 round-trip

-- 최근 row 필터
SELECT * FROM messages
WHERE  created_at >= datetime('now', '-1 day');
Boolean — INTEGER 저장, 자연스럽게 query·sql
CREATE TABLE flags (id INTEGER PRIMARY KEY, archived INTEGER NOT NULL DEFAULT 0) STRICT;

INSERT INTO flags(archived) VALUES (TRUE);   -- 1 로 저장
INSERT INTO flags(archived) VALUES (FALSE);  -- 0 으로 저장

SELECT * FROM flags WHERE archived;          -- WHERE 1 -> 매치
SELECT * FROM flags WHERE NOT archived;      -- 0 row 매치

External links

Exercise

created_at 컬럼 있는 작은 events 테이블에서 날짜 저장 3 가지 — ISO 8601 text, Unix epoch integer, Julian Day — 시연. 각각 같은 '최근 24 시간 row' query 작성. 100,000 row 테이블에서 시간 측정. 어떤 걸 default 로 할지 한 단락으로 추천.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.