본문 바로가기
WIKI 기술 지식 베이스

날짜 및 시간 함수

원문 보기 위키 갱신

날짜 및 시간 함수 (Date and Time Functions)

Turso는 SQLite와 호환되는 날짜·시간 함수들을 갖추고 있어요. 다양한 형식의 시간 값을 받아서, 선택적으로 수정자(modifier)를 적용하고, 함수에 따라 TEXT, REAL, INTEGER로 결과를 돌려줘요.

출처: 문서

본문

모든 날짜·시간 함수는 역산 그레고리력을 사용하고, localtime 수정자를 적용하지 않는 한 UTC를 기준으로 동작해요.

함수들

date()

날짜를 YYYY-MM-DD 형식의 TEXT로 반환해요.

date(time-value, modifier, modifier, ...)
매개변수 타입 설명
time-value TEXT, REAL, or INTEGER 지원 형식 중 하나인 시간 값
modifier TEXT 왼쪽에서 오른쪽으로 적용되는 0개 이상의 수정자

반환: YYYY-MM-DD 형식의 TEXT. 인수가 하나라도 잘못되면 NULL.

SELECT date('now');
-- '2025-06-15'

SELECT date('2025-06-15 14:30:00');
-- '2025-06-15'

SELECT date('2025-06-15', '+1 month');
-- '2025-07-15'

SELECT date('2025-06-15', 'start of year');
-- '2025-01-01'

time()

시간을 HH:MM:SS 형식의 TEXT로 반환해요.

time(time-value, modifier, modifier, ...)
매개변수 타입 설명
time-value TEXT, REAL, or INTEGER 지원 형식 중 하나인 시간 값
modifier TEXT 왼쪽에서 오른쪽으로 적용되는 0개 이상의 수정자

반환: HH:MM:SS 형식의 TEXT. 인수가 하나라도 잘못되면 NULL.

SELECT time('now');
-- '14:30:00'

SELECT time('2025-06-15 14:30:00');
-- '14:30:00'

SELECT time('14:30:00', '+2 hours');
-- '16:30:00'

SELECT time('14:30:00', '+90 minutes');
-- '16:00:00'

datetime()

날짜와 시간을 YYYY-MM-DD HH:MM:SS 형식의 TEXT로 반환해요.

datetime(time-value, modifier, modifier, ...)
매개변수 타입 설명
time-value TEXT, REAL, or INTEGER 지원 형식 중 하나인 시간 값
modifier TEXT 왼쪽에서 오른쪽으로 적용되는 0개 이상의 수정자

반환: YYYY-MM-DD HH:MM:SS 형식의 TEXT. 인수가 하나라도 잘못되면 NULL.

SELECT datetime('now');
-- '2025-06-15 14:30:00'

SELECT datetime('2025-06-15', '+1 day', '+6 hours');
-- '2025-06-16 06:00:00'

SELECT datetime(1718458200, 'unixepoch');
-- '2024-06-15 14:30:00'

julianday()

율리우스 날짜 수를 REAL로 반환해요. 율리우스 날짜 수는 기원전 4714년 11월 24일 정오(역산 그레고리력) 이후의 일수예요.

julianday(time-value, modifier, modifier, ...)
매개변수 타입 설명
time-value TEXT, REAL, or INTEGER 지원 형식 중 하나인 시간 값
modifier TEXT 왼쪽에서 오른쪽으로 적용되는 0개 이상의 수정자

반환: 율리우스 날짜 수를 나타내는 REAL. 인수가 하나라도 잘못되면 NULL.

SELECT julianday('2025-06-15');
-- 2460811.5

SELECT julianday('now');
-- 2460811.104166...

-- Compute the number of days between two dates
SELECT julianday('2025-12-25') - julianday('2025-06-15');
-- 193.0

unixepoch()

Unix 타임스탬프를 INTEGER로 반환해요. Unix 타임스탬프는 1970-01-01 00:00:00 UTC 이후의 초 수예요.

unixepoch(time-value, modifier, modifier, ...)
매개변수 타입 설명
time-value TEXT, REAL, or INTEGER 지원 형식 중 하나인 시간 값
modifier TEXT 왼쪽에서 오른쪽으로 적용되는 0개 이상의 수정자

반환: Unix epoch 이후의 초를 나타내는 INTEGER. 인수가 하나라도 잘못되면 NULL. subsec 수정자를 쓰면 소수 초를 담은 REAL을 반환해요.

SELECT unixepoch('now');
-- 1718458200

SELECT unixepoch('2025-06-15 14:30:00');
-- 1750001400

SELECT unixepoch('2025-06-15 14:30:00.123', 'subsec');
-- 1750001400.123

strftime()

지정한 형식 문자열에 맞춰 포맷된 날짜/시간 문자열을 반환해요.

strftime(format, time-value, modifier, modifier, ...)
매개변수 타입 설명
format TEXT 치환 코드를 담은 형식 문자열
time-value TEXT, REAL, or INTEGER 지원 형식 중 하나인 시간 값
modifier TEXT 왼쪽에서 오른쪽으로 적용되는 0개 이상의 수정자

반환: 형식 코드가 날짜/시간 구성 요소로 치환된 TEXT. 인수가 하나라도 잘못되면 NULL.

다른 날짜/시간 함수들은 strftime 호출로 표현할 수 있어요:

함수 동등한 strftime
date(...) strftime('%Y-%m-%d', ...)
time(...) strftime('%H:%M:%S', ...)
datetime(...) strftime('%Y-%m-%d %H:%M:%S', ...)
julianday(...) strftime('%J', ...) (as TEXT)
unixepoch(...) strftime('%s', ...) (as TEXT)
SELECT strftime('%Y', 'now');
-- '2025'

SELECT strftime('%m/%d/%Y', '2025-06-15');
-- '06/15/2025'

SELECT strftime('%H:%M', '2025-06-15 14:30:00');
-- '14:30'

SELECT strftime('%Y-%m-%d %H:%M:%f', '2025-06-15 14:30:00.123');
-- '2025-06-15 14:30:00.123'

SELECT strftime('%s', '2025-06-15 14:30:00');
-- '1750001400'

SELECT strftime('%W', '2025-06-15');
-- '23' (week of year)

strftime 형식 코드

코드 설명 예제
%d Day of month (01-31) 15
%e Day of month with leading space ( 1-31) 15
%f Fractional seconds (SS.SSS) 00.123
%F ISO 8601 date (YYYY-MM-DD) 2025-06-15
%H Hour (00-23) 14
%I Hour (01-12) 02
%j Day of year (001-366) 166
%J Julian day number 2460811.5
%k Hour with leading space ( 0-23) 14
%l Hour with leading space ( 1-12) 2
%m Month (01-12) 06
%M Minute (00-59) 30
%p AM or PM PM
%P am or pm pm
%R Time as HH:MM 14:30
%s Seconds since Unix epoch 1750001400
%S Seconds (00-59) 00
%T Time as HH:MM:SS 14:30:00
%u Day of week (1=Monday, 7=Sunday) 7
%w Day of week (0=Sunday, 6=Saturday) 0
%W Week of year (00-53) 23
%Y Year (0000-9999) 2025
%% Literal % character %

timediff()

두 시간 값의 차이를 (+|-)YYYY-MM-DD HH:MM:SS.SSS 형식의 TEXT 문자열로 반환해요. 이 결과는 time2에 더하면 time1이 되는 시간을 나타내요.

timediff(time1, time2)
매개변수 타입 설명
time1 TEXT, REAL, or INTEGER 더 나중 시간 값
time2 TEXT, REAL, or INTEGER 더 이른 시간 값

반환: (+|-)YYYY-MM-DD HH:MM:SS.SSS 형식의 TEXT. 어느 한쪽 인수가 잘못되면 NULL.

SELECT timediff('2025-06-15', '2025-06-10');
-- '+0000-00-05 00:00:00.000'

SELECT timediff('2025-01-01', '2024-01-01');
-- '+0001-00-00 00:00:00.000'

SELECT timediff('2025-06-15 14:30:00', '2025-06-15 10:00:00');
-- '+0000-00-00 04:30:00.000'

SELECT timediff('2024-01-01', '2025-06-15');
-- '-0001-05-14 00:00:00.000'

시간 값 형식

모든 날짜·시간 함수는 다음 형식의 시간 값을 받아요.

형식 예제 설명
YYYY-MM-DD '2025-06-15' 날짜만 (시간은 00:00:00 기본)
YYYY-MM-DD HH:MM '2025-06-15 14:30' 날짜와 시간 (초는 00 기본)
YYYY-MM-DD HH:MM:SS '2025-06-15 14:30:00' 초를 포함한 날짜와 시간
YYYY-MM-DD HH:MM:SS.SSS '2025-06-15 14:30:00.123' 소수 초를 포함한 날짜와 시간
YYYY-MM-DDTHH:MM '2025-06-15T14:30' T 구분자를 쓰는 ISO 8601
YYYY-MM-DDTHH:MM:SS '2025-06-15T14:30:00' T 구분자를 쓰는 ISO 8601
YYYY-MM-DDTHH:MM:SS.SSS '2025-06-15T14:30:00.123' T 구분자를 쓰는 ISO 8601
HH:MM '14:30' 시간만 (날짜는 2000-01-01 기본)
HH:MM:SS '14:30:00' 초를 포함한 시간만
HH:MM:SS.SSS '14:30:00.123' 소수 초를 포함한 시간만
now 'now' UTC 기준 현재 날짜와 시간
Julian day number 2460811.5 율리우스 날짜를 나타내는 REAL 수
Unix timestamp 1718458200 INTEGER. 'unixepoch' 수정자 필요
시간 값으로 Unix 타임스탬프를 넘길 때는 반드시 `'unixepoch'` 수정자를 붙여야 해요. 그래야 함수가 그 수를 율리우스 날짜가 아니라 1970-01-01 이후의 초로 해석해요.
-- Unix timestamp requires the 'unixepoch' modifier
SELECT datetime(1718458200, 'unixepoch');
-- '2024-06-15 14:30:00'

-- Without 'unixepoch', the number is treated as a Julian day
SELECT datetime(1718458200);
-- NULL (or a very distant date)

-- 'now' returns the current UTC time
SELECT datetime('now');
-- '2025-06-15 14:30:00'

수정자 (Modifiers)

수정자는 시간 값을 변형해요. 여러 수정자는 왼쪽에서 오른쪽으로 차례로 적용되고, 하나라도 잘못되면 함수는 NULL을 반환해요.

오프셋 수정자

오프셋 수정자는 시간 값에 지정한 양을 더하거나 빼요.

수정자 설명 예제
NNN days NNN일 더하기 '+7 days', '-1 days'
NNN hours NNN시간 더하기 '+6 hours'
NNN minutes NNN분 더하기 '+30 minutes'
NNN seconds NNN초 더하기 '+90 seconds'
NNN.NNNN seconds 소수 초 더하기 '+0.5 seconds'
NNN months NNN개월 더하기 '+1 months'
NNN years NNN년 더하기 '+1 years'

NNN은 양수 또는 음수 정수가 될 수 있어요 (초는 실수도 가능). 양수 값에서 + 기호는 생략할 수 있어요.

SELECT date('2025-06-15', '+7 days');
-- '2025-06-22'

SELECT datetime('2025-06-15 14:30:00', '-6 hours');
-- '2025-06-15 08:30:00'

SELECT date('2025-01-31', '+1 months');
-- '2025-03-03' (Jan 31 + 1 month = Mar 3)

시간 오프셋 수정자

+HH:MM 또는 -HH:MM 형식의 시간 오프셋은 지정한 시간과 분을 더하거나 빼요.

SELECT time('14:30:00', '+05:30');
-- '20:00:00'

SELECT datetime('2025-06-15 14:30:00', '-08:00');
-- '2025-06-15 06:30:00'

Start-of 수정자

이 수정자들은 시간 값을 해당 기간의 시작점으로 되돌려요.

수정자 설명
start of day 시간을 00:00:00으로 맞추고 날짜는 유지
start of month 그 달의 첫날로, 시간은 00:00:00으로
start of year 그 해 1월 1일로, 시간은 00:00:00으로
SELECT datetime('2025-06-15 14:30:00', 'start of day');
-- '2025-06-15 00:00:00'

SELECT date('2025-06-15', 'start of month');
-- '2025-06-01'

SELECT date('2025-06-15', 'start of year');
-- '2025-01-01'

요일 수정자

weekday N 수정자는 날짜를 지정한 요일의 다음 등장일로 진행해요. 0 = 일요일, 1 = 월요일, ..., 6 = 토요일이에요. 현재 날짜가 이미 그 요일이면 바뀌지 않아요.

-- Next Sunday (weekday 0)
SELECT date('2025-06-15', 'weekday 0');
-- '2025-06-15' (June 15, 2025 is a Sunday)

-- Next Monday
SELECT date('2025-06-15', 'weekday 1');
-- '2025-06-16'

-- Next Friday
SELECT date('2025-06-15', 'weekday 5');
-- '2025-06-20'

해석 수정자

수정자 설명
unixepoch 시간 값을 Unix 타임스탬프(1970-01-01 이후의 초)로 해석
julianday 시간 값을 율리우스 날짜 수로 해석
auto 값이 Unix 타임스탬프인지 율리우스 날짜인지 자동 판별
SELECT datetime(1718458200, 'unixepoch');
-- '2024-06-15 14:30:00'

SELECT datetime(2460811.5, 'julianday');
-- '2025-06-15 00:00:00'

SELECT datetime(0, 'unixepoch');
-- '1970-01-01 00:00:00'

타임존 수정자

수정자 설명
localtime UTC에서 현지 시간으로 변환
utc 현지 시간에서 UTC로 변환
SELECT datetime('2025-06-15 14:30:00', 'localtime');
-- '2025-06-15 07:30:00' (example: UTC-7)

SELECT time('now', 'localtime');
-- Local current time

반올림 수정자

수정자 설명
ceiling 월을 더할 때 날이 넘치면 다음 달 1일로 진행
floor 월을 더할 때 날이 넘치면 대상 달의 마지막 날 사용

이 수정자들은 일 수가 다른 달 사이의 월 연산 처리 방식에 영향을 줘요.

-- Without floor/ceiling, month overflow rolls forward
SELECT date('2025-01-31', '+1 months');
-- '2025-03-03'

-- With floor, clamp to last day of target month
SELECT date('2025-01-31', 'floor', '+1 months');
-- '2025-02-28'

-- With ceiling, advance to first of next month
SELECT date('2025-01-31', 'ceiling', '+1 months');
-- '2025-03-01'

subsec 수정자

subsec 수정자는 unixepoch()가 INTEGER로 잘라내는 대신 소수 초를 담은 REAL을 반환하게 해줘요.

SELECT unixepoch('2025-06-15 14:30:00.456', 'subsec');
-- 1750001400.456

실전 예제

현재 날짜와 시간 구하기

SELECT date('now');                    -- Current UTC date
SELECT time('now');                    -- Current UTC time
SELECT datetime('now');                -- Current UTC date and time
SELECT datetime('now', 'localtime');   -- Current local date and time

날짜 산술

-- Tomorrow
SELECT date('now', '+1 day');

-- 90 days from now
SELECT date('now', '+90 days');

-- Last day of the current month
SELECT date('now', 'start of month', '+1 month', '-1 day');

-- First Monday of the current month
SELECT date('now', 'start of month', 'weekday 1');

나이 계산

SELECT
    name,
    birth_date,
    timediff('now', birth_date) AS age_diff
FROM users;

형식 변환

-- Unix timestamp to human-readable
SELECT datetime(1718458200, 'unixepoch');

-- Human-readable to Unix timestamp
SELECT unixepoch('2025-06-15 14:30:00');

-- Date to Julian day
SELECT julianday('2025-06-15');

-- Julian day to date
SELECT date(2460811.5);

기간별 레코드 그룹화

-- Count orders per month
SELECT
    strftime('%Y-%m', order_date) AS month,
    COUNT(*) AS order_count
FROM orders
GROUP BY strftime('%Y-%m', order_date)
ORDER BY month;

-- Count events per day of week
SELECT
    CASE strftime('%w', event_date)
        WHEN '0' THEN 'Sunday'
        WHEN '1' THEN 'Monday'
        WHEN '2' THEN 'Tuesday'
        WHEN '3' THEN 'Wednesday'
        WHEN '4' THEN 'Thursday'
        WHEN '5' THEN 'Friday'
        WHEN '6' THEN 'Saturday'
    END AS day_name,
    COUNT(*) AS event_count
FROM events
GROUP BY strftime('%w', event_date)
ORDER BY strftime('%w', event_date);

날짜 범위로 필터링

-- Records from the last 30 days
SELECT * FROM logs
WHERE timestamp >= datetime('now', '-30 days');

-- Records from a specific month
SELECT * FROM orders
WHERE order_date >= '2025-06-01'
  AND order_date < '2025-07-01';

-- Records from this year
SELECT * FROM sales
WHERE date(sale_date) >= date('now', 'start of year');

경과 시간 계산

-- Days between two dates
SELECT julianday('2025-12-25') - julianday('now') AS days_until_christmas;

-- Seconds between two timestamps
SELECT unixepoch('2025-06-15 18:00:00') - unixepoch('2025-06-15 14:30:00') AS seconds_elapsed;
-- 12600

더 알아보기 (Learn more)