Oracle 和 MySQL 都提供了多种日期和时间数据类型,但它们在实现和功能上有一些差异。以下是两者的主要日期类型对比:
Oracle 日期类型
- DATE
- 存储日期和时间(精确到秒)
- 格式:YYYY-MM-DD HH24:MI:SS
- 示例:
TO_DATE('2023-11-15 14:30:00', 'YYYY-MM-DD HH24:MI:SS')
- TIMESTAMP
- 比 DATE 更精确,可包含小数秒(最多9位)
- 示例:
TIMESTAMP '2023-11-15 14:30:00.123456789'
- TIMESTAMP WITH TIME ZONE
- 包含时区信息
- 示例:
TIMESTAMP '2023-11-15 14:30:00 -05:00'
- TIMESTAMP WITH LOCAL TIME ZONE
- 存储时转换为数据库时区,检索时转换回用户时区
- INTERVAL YEAR TO MONTH
- 存储年-月间隔
- 示例:
INTERVAL '1-2' YEAR TO MONTH
(1年2个月)
- INTERVAL DAY TO SECOND
- 存储日-秒间隔
- 示例:
INTERVAL '5 12:30:45.123' DAY TO SECOND
(5天12小时30分45.123秒)
MySQL 日期类型
- DATE
- 仅存储日期(不包含时间)
- 格式:YYYY-MM-DD
- 示例:
'2023-11-15'
- TIME
- 仅存储时间(可包含微秒)
- 格式:HH:MM:SS[.fraction]
- 示例:
'14:30:00'
或'14:30:00.123456'
- DATETIME
- 存储日期和时间(精确到秒或微秒)
- 格式:YYYY-MM-DD HH:MM:SS[.fraction]
- 示例:
'2023-11-15 14:30:00'
或'2023-11-15 14:30:00.123456'
- TIMESTAMP
- 存储日期和时间(1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC)
- 自动转换为 UTC 存储,检索时转换回当前时区
- 示例:
TIMESTAMP(6)
可存储微秒
- YEAR
- 仅存储年份(1901-2155)
- 示例:
YEAR(4)
存储为4位数年份
主要差异
- 精度:
- Oracle 的 TIMESTAMP 支持最多9位小数秒
- MySQL 的 DATETIME/TIMESTAMP 支持最多6位小数秒
- 时区处理:
- Oracle 有专门的时区感知类型(TIMESTAMP WITH TIME ZONE)
- MySQL 的 TIMESTAMP 会自动转换时区,DATETIME 不会
- 范围:
- Oracle DATE 范围:公元前4712年到公元9999年
- MySQL TIMESTAMP 范围较小(1970-2038年)
- 存储:
- Oracle DATE 固定占用7字节
- MySQL DATETIME 占用8字节(无小数秒),TIMESTAMP 占用4字节(无小数秒)
示例用法
Oracle:
CREATE TABLE events (
event_id NUMBER,
event_date DATE,
event_timestamp TIMESTAMP,
event_tz TIMESTAMP WITH TIME ZONE
);
MySQL:
CREATE TABLE events (
event_id INT,
event_date DATE,
event_datetime DATETIME(6),
event_timestamp TIMESTAMP(6)
);
选择哪种类型取决于您的具体需求,包括是否需要时区支持、所需精度以及数据范围等因素。