SQL 타임스탬프 함수 참조
널리 사용되는 데이터베이스 시스템 전반의 타임스탬프 작업에 대한 빠른 참조입니다.
현재 타임스탬프
| 데이터베이스 | 현재 타임스탬프(UTC) | 현재 타임스탬프(로컬) |
|---|
| MySQL | NOW(), UTC_TIMESTAMP() | NOW(), LOCALTIMESTAMP() |
| PostgreSQL | NOW(), CURRENT_TIMESTAMP | NOW(), CURRENT_TIMESTAMP |
| SQLite | 날짜시간('지금') | 날짜시간('현재', '현지시간') |
| SQL 서버 | GETUTCDATE() | GETDATE(), SYSDATETIME() |
| 오라클 | SYSTIMESTAMP, SYS_EXTRACT_UTC(SYSTIMESTAMP) | SYSTIMESTAMP |
유닉스 타임스탬프 작업
현재 Unix 타임스탬프 가져오기
| 데이터베이스 | 코드 |
|---|
| MySQL | UNIX_TIMESTAMP() |
| PostgreSQL | 추출(현재_TIMESTAMP에서 에포크) |
| SQLite | strftime('%s', '지금') |
| SQL 서버 | DATEDIFF(s, '1970-01-01', GETUTCDATE()) |
| 오라클 | (SYSTIMESTAMP - TO_TIMESTAMP('1970-01-01', 'YYYY-MM-DD')) * 86400 |
Unix 타임스탬프를 날짜로 변환
| 데이터베이스 | 코드 |
|---|
| MySQL | FROM_UNIXTIME(1704067200) |
| PostgreSQL | TO_TIMESTAMP(1704067200) |
| SQLite | datetime(1704067200, 'unixepoch') |
| SQL 서버 | DATEADD(s, 1704067200, '1970-01-01') |
| 오라클 | TO_DATE('1970-01-01', 'YYYY-MM-DD') + (1704067200 / 86400) |
날짜를 Unix 타임스탬프로 변환
| 데이터베이스 | 코드 |
|---|
| MySQL | UNIX_TIMESTAMP('2024-01-01 00:00:00') |
| PostgreSQL | 추출('2024-01-01 00:00:00'::타임스탬프의 EPOCH) |
| SQLite | strftime('%s', '2024-01-01 00:00:00') |
| SQL 서버 | DATEDIFF(s, '1970-01-01', '2024-01-01 00:00:00') |
| 오라클 | TO_CHAR('2024-01-01 00:00:00', 'J') - TO_CHAR(DATE '1970-01-01', 'J')) * 86400 |
날짜 형식
일반적인 날짜 형식
| 데이터베이스 | ISO 8601 | 미국 형식 | EU 형식 |
|---|
| MySQL | DATE_FORMAT(NOW(), '%Y-%m-%dT%H:%i:%s') | DATE_FORMAT(NOW(), '%m/%d/%Y') | DATE_FORMAT(NOW(), '%d/%m/%Y') |
| PostgreSQL | TO_CHAR(NOW(), 'YYYY-MM-DD"T"HH24:MI:SS') | TO_CHAR(NOW(), 'MM/DD/YYYY') | TO_CHAR(NOW(), 'DD/MM/YYYY') |
| SQLite | datetime('지금', 'iso8601') | - | - |
| SQL 서버 | FORMAT(GETUTCDATE(), 'yyyy-MM-ddTHH:mm:ss') | FORMAT(GETDATE(), 'MM/dd/yyyy') | FORMAT(GETDATE(), 'dd/MM/yyyy') |
| 오라클 | TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD"T"HH24:MI:SS') | TO_CHAR(SYSDATE, 'MM/DD/YYYY') | TO_CHAR(SYSDATE, 'DD/MM/YYYY') |
시간대 작업
현재 시간대 가져오기
| 데이터베이스 | 코드 |
|---|
| MySQL | TIMEZONE_NAME, @@time_zone |
| PostgreSQL | 현재_설정('시간대') |
| SQLite | 해당 없음(시간대 지원 안 함) |
| SQL 서버 | GETDATE(), DATENAME(TIMEZONE, SYSDATETIMEOFFSET()) |
| 오라클 | SESSIONTIMEZONE, DBTIMEZONE |
시간대 변환| 데이터베이스 | 코드 |
|------------|------|
| MySQL | CONVERT_TZ('2024-01-01 12:00:00', 'UTC', 'America/New_York') |
| PostgreSQL | ``2024-01-01 12:00:00 UTC'::timestamptz AT TIME ZONE 'America/New_York'| | **SQLite** | 해당 없음 | | **SQL 서버** |GETDATE() AT TIME ZONE 'UTC' AT TIME ZONE '동부 표준시'| | **오라클** |FROM_TZ(TIMESTAMP '2024-01-01 12:00:00', 'UTC') AT TIME ZONE 'America/New_York'` |
타임스탬프 산술
시간 더하기/빼기
| 데이터베이스 | 1일 추가 | 1시간 빼기 |
|---|
| MySQL | DATE_ADD(NOW(), 간격 1일) | DATE_SUB(지금(), 간격 1시간) |
| PostgreSQL | NOW() + 간격 '1일' | NOW() - 간격 '1시간' |
| SQLite | datetime('지금', '+1일') | datetime('지금', '-1시간') |
| SQL 서버 | DATEADD(일, 1, GETDATE()) | DATEADD(시, -1, GETDATE()) |
| 오라클 | SYSDATE + 1 | SYSDATE - (1/24) |
차이 계산
| 데이터베이스 | 일 사이 |
|---|
| MySQL | DATEDIFF('2024-01-15', '2024-01-01') |
| PostgreSQL | ``2024-01-15'::날짜 - '2024-01-01'::날짜` |
| SQLite | julianday('2024-01-15') - julianday('2024-01-01') |
| SQL 서버 | DATEDIFF(일, '2024-01-01', '2024-01-15') |
| 오라클 | TO_DATE('2024-01-15') - TO_DATE('2024-01-01') |
모범 사례
1. 타임스탬프를 UTC로 저장
타임스탬프는 항상 UTC 형식으로 저장하고 사용자에게 표시할 때만 현지 시간으로 변환하세요.
-- Good: Store in UTC
CREATE TABLE events (
id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Better: Explicit UTC
CREATE TABLE events (
id INT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
2. 적절한 데이터 유형을 사용하세요
| 사용 사례 | 권장 유형 |
|---|
| UTC 저장 | 시간대를 포함한 타임스탬프 |
| 현지 시간에만 | 시간대 없는 타임스탬프 |
| 유닉스 타임스탬프 | BIGINT(이식성용) |
| 날짜만 | 날짜 |
3. 시간대 변환을 적절하게 처리
-- PostgreSQL example
SELECT
created_at AT TIME ZONE 'UTC' AS utc_time,
created_at AT TIME ZONE 'America/New_York' AS ny_time,
created_at AT TIME ZONE 'Asia/Shanghai' AS shanghai_time
FROM events;
관련 도구