日期
SQL 提供了多种日期时间类型,帮你把时间这个抽象概念变成数据库能存能查的具体数据。
常用的日期时间类型有:
| 类型 | 格式 | 一句话说明 |
|---|---|---|
DATE | YYYY-MM-DD | 只存日期,不存时间 |
TIME | HH:MM:SS | 只存时间,不存日期 |
DATETIME | YYYY-MM-DD HH:MM:SS | 日期+时间,不随时区变 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 日期+时间,自动时区转换 |
YEAR | YYYY | 只存年份 |
DATETIME 和 TIMESTAMP 的区别要特别注意:TIMESTAMP 存储的是 UTC 时间戳,读取时自动转换为当前时区的时间,适合跨时区应用;DATETIME 存储的是字面值,不随时区变化,适合存储"绝对时间"(比如会议开始时间、生日)。TIMESTAMP 的范围是 1970 到 2038 年(32 位限制),DATETIME 的范围是 1000 到 9999 年。
什么场景需要它?几乎每张业务表都离不开日期字段:员工入职日期、订单创建时间、商品上架时间、工资发放日期。飞翔科技的员工表需要 join_year(入职年份),订单表需要 order_date(下单日期),日志表需要 created_at(创建时间戳)。选对类型,后续的日期计算、比较、格式化都会顺手得多。
标准写法:
CREATE TABLE 表名 (
列名 DATE,
列名 DATETIME DEFAULT CURRENT_TIMESTAMP
);
以飞翔科技为例。业务表中的日期应用:
-- 员工表:用 YEAR 存入职年份,DATE 存出生日期,DATETIME 存创建时间
CREATE TABLE employees (
emp_id INT AUTO_INCREMENT PRIMARY KEY,
emp_name VARCHAR(50) NOT NULL,
join_year YEAR, -- 入职年份,如 2018
birth_date DATE, -- 出生日期,如 1990-06-15
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
company_name VARCHAR(100) DEFAULT '广州飞翔科技'
);
-- 订单表:记录下单时间
CREATE TABLE orders (
order_id BIGINT AUTO_INCREMENT PRIMARY KEY,
product_id INT NOT NULL,
quantity INT NOT NULL,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
total_amount DECIMAL(10,2)
);
-- 插入员工数据
INSERT INTO employees (emp_name, join_year, birth_date)
VALUES ('翱翔', 2018, '1990-06-15');
-- 查询 2018 年入职的员工
SELECT emp_name, join_year
FROM employees
WHERE join_year = 2018;
YEAR 类型只占 1 字节,存年份绰绰有余;DATE 类型适合存生日、入职日这类"日期";DATETIME DEFAULT CURRENT_TIMESTAMP 让每条记录自动带上创建时间,省去了手动填写的麻烦。日期类型选对了,后续的"按年统计"、"按月汇总"、"计算年龄"等操作都会事半功倍。