SQL タイムスタンプ関数リファレンス
一般的なデータベース システム全体でのタイムスタンプ操作のクイック リファレンス。
現在のタイムスタンプ
| データベース | 現在のタイムスタンプ (UTC) | 現在のタイムスタンプ (ローカル) |
|---|
| MySQL | NOW()、UTC_TIMESTAMP() | NOW()、LOCALTIMESTAMP() |
| PostgreSQL | NOW()、CURRENT_TIMESTAMP | NOW()、CURRENT_TIMESTAMP |
| SQLite | datetime('now') | datetime('now', 'localtime') |
| SQL サーバー | GETUTCDATE() | GETDATE()、SYSDATETIME() |
| オラクル | SYSTIMESTAMP、SYS_EXTRACT_UTC(SYSTIMESTAMP) | SYSTIMESTAMP |
Unix タイムスタンプ操作
現在の Unix タイムスタンプを取得する
| データベース | コード |
|---|
| MySQL | UNIX_TIMESTAMP() |
| PostgreSQL | EXTRACT(CURRENT_TIMESTAMP からのエポック) |
| SQLite | strftime('%s', 'now') |
| 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 | EXTRACT(EPOCH FROM '2024-01-01 00:00:00'::timestamp) |
| 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 |
日付の書式設定
一般的な日付形式
| データベース | ISO8601 | 米国形式 | 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('now', '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 | current_setting('タイムゾーン') |
| SQLite | 該当なし (タイムゾーンはサポートされていません) |
| SQL サーバー | GETDATE(), DATENAME(TIMEZONE, SYSDATETIMEOFFSET()) |
| オラクル | SESSIONTIMEZONE、DBTIMEZONE |
タイムゾーンを変換する|データベース |コード |
|----------|------|
| MySQL | CONVERT_TZ('2024-01-01 12:00:00', 'UTC', 'アメリカ/ニューヨーク') |
| 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 'Eastern Standard Time' |
| オラクル | FROM_TZ(TIMESTAMP '2024-01-01 12:00:00', 'UTC') AT TIME ZONE 'アメリカ/ニューヨーク' |
タイムスタンプ演算
時間の加算/減算
| データベース | 1 日追加 | 1 時間を減算する |
|---|
| MySQL | DATE_ADD(NOW(), INTERVAL 1 DAY) | DATE_SUB(NOW(), 間隔 1 時間) |
| PostgreSQL | NOW() + 間隔 '1 日' | NOW() - 間隔 '1 時間' |
| SQLite | datetime('now', '+1 day') | 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 | ジュリアンデー('2024-01-15') - ジュリアンデー('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 ストレージ | タイムゾーン付きタイムスタンプ |
| 現地時間のみ | タイムゾーンなしのタイムスタンプ |
| Unix タイムスタンプ | 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;
関連ツール