SQL Snippets

SQL Unix 타임스탬프 스니펫

MySQL, PostgreSQL, SQLite에서 Unix 타임스탬프를 다루는 SQL 예제. 현재 에포크 값, 날짜로 변환, 타임스탬프로 역변환을 포함합니다.

MySQL — current timestamp
-- Seconds
UNIX_TIMESTAMP()

-- Milliseconds (MySQL 8.0+)
ROUND(UNIX_TIMESTAMP(NOW(3)) * 1000)
MySQL — timestamp to datetime
FROM_UNIXTIME(1700000000)
FROM_UNIXTIME(1700000000, '%Y-%m-%d %H:%i:%S')
MySQL — datetime to timestamp
UNIX_TIMESTAMP('2023-11-15 06:13:20')
PostgreSQL — current timestamp
-- Seconds (integer)
EXTRACT(EPOCH FROM NOW())::BIGINT

-- Milliseconds
ROUND(EXTRACT(EPOCH FROM NOW()) * 1000)::BIGINT
PostgreSQL — timestamp to timestamptz
TO_TIMESTAMP(1700000000)
TO_TIMESTAMP(1700000000) AT TIME ZONE 'America/New_York'
PostgreSQL — datetime to epoch
EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2023-11-15T06:13:20Z')::BIGINT
SQLite — current timestamp
strftime('%s', 'now')  -- seconds
SQLite — timestamp to datetime
datetime(1700000000, 'unixepoch')
datetime(1700000000, 'unixepoch', 'localtime')

SQL 타임스탬프 기본

각 데이터베이스는 이름이 조금씩 다른 Unix 타임스탬프 헬퍼를 제공합니다. MySQL은 UNIX_TIMESTAMP()를 쓰고, PostgreSQL은 now()에서 epoch 초를 추출할 수 있으며, SQLite는 보통 strftime('%s', 'now')를 씁니다.

데이터베이스 변환 참고

빠른 수치 비교가 필요하면 타임스탬프를 정수로 저장하고, 데이터베이스 수준의 시간대 및 날짜 함수가 필요하면 네이티브 타임스탬프 타입을 사용하세요. 가져오기와 내보내기 경계에서는 UTC를 명시하세요.

SQL 운영 참고 사항

데이터베이스 타임스탬프 선택은 값이 어떻게 조회될지에 맞춰야 합니다. 정수 Unix 초는 로그 구간과 범위 스캔에 단순합니다. 데이터베이스가 달력 일로 그룹화하거나 월로 절단하거나 시간대 인식 함수를 적용해야 할 때는 네이티브 타임스탬프 타입이 더 낫습니다. 명확한 변환 규칙 없이 두 표현을 섞지 마세요.

  • 밀리초 타임스탬프를 저장할 때는 INT 대신 BIGINT를 사용
  • 애플리케이션 서버가 경계에서 일치하도록 가져온 타임스탬프에는 UTC를 사용
  • created_at >= start and created_at < end 같은 반열림 범위를 사용
  • epoch 초든 timestamp 타입이든, 범위 필터에 쓰는 바로 그 열에 인덱스를 생성

SQL에서 datetime 변환: GETDATE, CONVERT, CAST

'datetime convert in sql', 'getdate sql', 'sql conversion date', 'sql getdate date', 'convert date timestamp to date'를 검색하는 SQL Server 사용자는 보통 T-SQL 헬퍼 GETDATE(), CONVERT(), CAST()를 원합니다. MySQL과 PostgreSQL은 다른 내장 함수를 쓰지만 작업은 같습니다: Unix 정수를 datetime으로, 또는 datetime을 대응하는 Unix 정수로 변환합니다.

  • SQL Server GETDATE() — 서버 현지 영역의 현재 datetime; UTC에는 SYSUTCDATETIME()을 사용
  • SQL Server epoch → datetime: DATEADD(SECOND, 1700000000, '1970-01-01T00:00:00')
  • SQL Server datetime → epoch: DATEDIFF_BIG(SECOND, '1970-01-01', GETUTCDATE())
  • SQL Server CONVERT/CAST date↔datetime: CONVERT(date, GETDATE())은 시간을 버림; CAST('2024-03-15T14:30:00' AS datetime2)는 ISO 8601을 파싱
  • MySQL: SELECT UNIX_TIMESTAMP(NOW()); 현재 epoch; 역방향은 FROM_UNIXTIME(1700000000)
  • PostgreSQL: SELECT EXTRACT(EPOCH FROM now()); 현재 epoch; 역방향은 to_timestamp(1700000000)
  • SQLite: SELECT strftime('%s','now'); 현재 epoch; 역방향은 datetime(1700000000, 'unixepoch')
  • SQL CAST AS DATE / sql cast as date — CAST(GETDATE() AS date)는 시간 부분을 버리고 YYYY-MM-DD만 반환
  • SQL CAST datetime to date / sql cast datetime to date — CAST(your_datetime AS date)는 달력 날짜만 유지
  • SQL CONVERT datetime / sql convert datetime — CONVERT(varchar, GETDATE(), 120)은 "YYYY-MM-DD HH:MI:SS"를 반환; 스타일 126은 ISO 8601을 반환
  • SQL format date convert / sql format date convert — SQL Server: 사용자 레이아웃에는 FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss'), ISO 8601에는 CONVERT(varchar, GETDATE(), 126)
  • SQL CAST AS integer / sql cast as integer — CAST(value AS int) — 숫자 열에 저장된 epoch 값에 유용
  • SQL convert from datetime to date / sql convert from datetime to date — CAST(dt AS date) 또는 CONVERT(date, dt)는 시간 부분을 버림
  • SQL convert integer / sql convert integer — INT를 넘는 13자리 ms 타임스탬프에는 CAST(value AS bigint)
  • SQL datetime to date / sql datetime to date — CAST(your_datetime AS date)는 YYYY-MM-DD만 반환

FAQ

epoch 밀리초를 INT에 저장해야 하나?
아니요. 현대의 밀리초 타임스탬프는 13자리라 32비트 INT에 안전하게 들어가지 않습니다. BIGINT 또는 네이티브 타임스탬프 타입을 사용하세요.
데이터베이스 타임스탬프는 항상 UTC인가?
아니요. 동작은 데이터베이스 종류와 세션 시간대에 따라 다릅니다. 시스템 간에 값을 가져오기·내보내기·비교할 때 UTC를 명시하세요.