extract函数可提取year、month、day、hour、minute、second等标准字段,部分数据库还支持quarter、week、dow、doy、epoch等;字段名大小写不敏感,但不可加引号,且不同数据库对数据类型和语法要求存在差异。

EXTRACT 能提取哪些日期字段
EXTRACT 函数用于从 TIMESTAMP 或 DATE 类型中取出指定的时间单位,常见可提取的字段包括:YEAR、MONTH、DAY、HOUR、MINUTE、SECOND,部分数据库还支持 QUARTER、WEEK、DOW(星期几)等。
注意:字段名大小写不敏感,但必须是标准关键字,不能写成 'year' 字符串,也不能用反引号或双引号包裹(PostgreSQL 除外,它允许双引号但不推荐)。
不同数据库对 EXTRACT 的语法差异
主流数据库基本都支持 EXTRACT,但细节有差别:
- PostgreSQL 和标准 SQL:写法统一为
EXTRACT(YEAR FROM my_date) - MySQL 不支持
EXTRACT的标准语法,它用的是YEAR()、MONTH()、DAY()等独立函数;误用EXTRACT(YEAR FROM ...)会报错FUNCTION database.EXTRACT does not exist - Oracle 支持
EXTRACT,但只接受TIMESTAMP类型,对DATE需显式转换:EXTRACT(YEAR FROM CAST(my_date AS TIMESTAMP)) - SQL Server 完全不支持
EXTRACT,得用YEAR()、MONTH()等函数替代
提取年月日的典型写法与常见错误
假设表 orders 有列 order_time(类型为 TIMESTAMP),想查出每笔订单的年、月、日三列:
SELECT EXTRACT(YEAR FROM order_time) AS y, EXTRACT(MONTH FROM order_time) AS m, EXTRACT(DAY FROM order_time) AS d FROM orders;
容易踩的坑:
- 把
EXTRACT当成字符串函数,写成EXTRACT('YEAR' FROM ...)—— 报错,关键字不能加引号 - 在 MySQL 里硬套这个语法,结果提示函数不存在;应改用
YEAR(order_time) - 对
NULL值调用EXTRACT,结果直接返回NULL,不会报错,但可能影响后续计算逻辑,建议提前用COALESCE处理 - 某些旧版 PostgreSQL(如 8.x)不支持
EXTRACT(DAY FROM DATE)中的DATE类型,需先转成TIMESTAMP
需要拼接年月日字符串怎么办
EXTRACT 返回的是整数,不能直接拼成 '2024-05-21' 这种格式。如果目标是生成标准日期字符串,别用多次 EXTRACT 拼接 —— 容易漏补零、类型转换麻烦、性能也差。
更稳妥的做法:
- PostgreSQL:用
TO_CHAR(order_time, 'YYYY-MM-DD') - MySQL:用
DATE_FORMAT(order_time, '%Y-%m-%d') - 如果非要用
EXTRACT拼,至少加上LPAD补零,例如:LPAD(EXTRACT(MONTH FROM order_time)::TEXT, 2, '0')(PostgreSQL)
跨数据库兼容性最差的正是这种手动拼接逻辑,实际项目中优先考虑数据库原生的格式化函数。










