时间戳资源

SQL时间戳函数参考

SQL时间戳函数参考

主流数据库系统时间戳操作的快速参考。

获取当前时间戳

数据库当前时间戳 (UTC)当前时间戳 (本地)
MySQLNOW(), UTC_TIMESTAMP()NOW(), LOCALTIMESTAMP()
PostgreSQLNOW(), CURRENT_TIMESTAMPNOW(), CURRENT_TIMESTAMP
SQLitedatetime('now')datetime('now', 'localtime')
SQL ServerGETUTCDATE()GETDATE(), SYSDATETIME()
OracleSYSTIMESTAMP, SYS_EXTRACT_UTC(SYSTIMESTAMP)SYSTIMESTAMP

Unix时间戳操作

获取当前Unix时间戳

数据库代码
MySQLUNIX_TIMESTAMP()
PostgreSQLEXTRACT(EPOCH FROM CURRENT_TIMESTAMP)
SQLitestrftime('%s', 'now')
SQL ServerDATEDIFF(s, '1970-01-01', GETUTCDATE())
Oracle(SYSTIMESTAMP - TO_TIMESTAMP('1970-01-01', 'YYYY-MM-DD')) * 86400

Unix时间戳转日期

数据库代码
MySQLFROM_UNIXTIME(1704067200)
PostgreSQLTO_TIMESTAMP(1704067200)
SQLitedatetime(1704067200, 'unixepoch')
SQL ServerDATEADD(s, 1704067200, '1970-01-01')
OracleTO_DATE('1970-01-01', 'YYYY-MM-DD') + (1704067200 / 86400)

日期转Unix时间戳

数据库代码
MySQLUNIX_TIMESTAMP('2024-01-01 00:00:00')
PostgreSQLEXTRACT(EPOCH FROM '2024-01-01 00:00:00'::timestamp)
SQLitestrftime('%s', '2024-01-01 00:00:00')
SQL ServerDATEDIFF(s, '1970-01-01', '2024-01-01 00:00:00')
Oracle(TO_DATE('2024-01-01', 'J') - TO_DATE('1970-01-01', 'J')) * 86400

日期格式化

常用日期格式

数据库ISO 8601美国格式欧洲格式
MySQLDATE_FORMAT(NOW(), '%Y-%m-%dT%H:%i:%s')DATE_FORMAT(NOW(), '%m/%d/%Y')DATE_FORMAT(NOW(), '%d/%m/%Y')
PostgreSQLTO_CHAR(NOW(), 'YYYY-MM-DD"T"HH24:MI:SS')TO_CHAR(NOW(), 'MM/DD/YYYY')TO_CHAR(NOW(), 'DD/MM/YYYY')
SQLitedatetime('now', 'iso8601')--
SQL ServerFORMAT(GETUTCDATE(), 'yyyy-MM-ddTHH:mm:ss')FORMAT(GETDATE(), 'MM/dd/yyyy')FORMAT(GETDATE(), 'dd/MM/yyyy')
OracleTO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD"T"HH24:MI:SS')TO_CHAR(SYSDATE, 'MM/DD/YYYY')TO_CHAR(SYSDATE, 'DD/MM/YYYY')

时区操作

获取当前时区

数据库代码
MySQLTIMEZONE_NAME, @@time_zone
PostgreSQLcurrent_setting('timezone')
SQLite不支持时区
SQL ServerGETDATE(), DATENAME(TIMEZONE, SYSDATETIMEOFFSET())
OracleSESSIONTIMEZONE, DBTIMEZONE

时区转换

数据库代码
MySQLCONVERT_TZ('2024-01-01 12:00:00', 'UTC', 'Asia/Shanghai')
PostgreSQL'2024-01-01 12:00:00 UTC'::timestamptz AT TIME ZONE 'Asia/Shanghai'
SQLite不支持时区
SQL ServerGETDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'China Standard Time'
OracleFROM_TZ(TIMESTAMP '2024-01-01 12:00:00', 'UTC') AT TIME ZONE 'Asia/Shanghai'

时间戳计算

加减时间

数据库加1天减1小时
MySQLDATE_ADD(NOW(), INTERVAL 1 DAY)DATE_SUB(NOW(), INTERVAL 1 HOUR)
PostgreSQLNOW() + INTERVAL '1 day'NOW() - INTERVAL '1 hour'
SQLitedatetime('now', '+1 day')datetime('now', '-1 hour')
SQL ServerDATEADD(day, 1, GETDATE())DATEADD(hour, -1, GETDATE())
OracleSYSDATE + 1SYSDATE - (1/24)

计算差值

数据库天数差
MySQLDATEDIFF('2024-01-15', '2024-01-01')
PostgreSQL'2024-01-15'::date - '2024-01-01'::date
SQLitejulianday('2024-01-15') - julianday('2024-01-01')
SQL ServerDATEDIFF(day, '2024-01-01', '2024-01-15')
OracleTO_DATE('2024-01-15') - TO_DATE('2024-01-01')

最佳实践

1. 使用UTC存储时间戳

始终以UTC格式存储时间戳,只在显示给用户时才转换为本地时间。

-- 推荐:使用UTC存储
CREATE TABLE events (
    id INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 更好:明确指定UTC
CREATE TABLE events (
    id INT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

2. 使用适当的数据类型

使用场景推荐类型
UTC存储TIMESTAMP WITH TIME ZONE
本地时间TIMESTAMP WITHOUT TIME zone
Unix时间戳BIGINT(便于移植)
仅日期DATE

3. 正确处理时区转换

-- PostgreSQL示例
SELECT 
    created_at AT TIME ZONE 'UTC' AS utc_time,
    created_at AT TIME ZONE 'Asia/Shanghai' AS shanghai_time
FROM events;

相关工具