一、为什么这个函数能让时间"开口说话"?
在数据库世界里,时间数据就像被封印的宝箱📦。当你需要:
-
统计每月销售额💰
-
分析用户活跃时间段⏰
-
计算用户年龄🎂
-
生成年度报表📊
EXTRACT函数就是打开这些宝箱的万能钥匙!它能把复杂的日期时间数据拆解成我们需要的具体部分,让数据真正"开口说话"!
二、手把手教你EXTRACT基础咒语
基础语法(记住这个万能公式!)
SELECT EXTRACT(字段 FROM 时间表达式)
常用时间单位大全(速查表)
单位 | 说明 | 示例值 |
---|---|---|
YEAR | 年份 | 2025 |
MONTH | 月份(1-12) | 3 |
DAY | 日期(1-31) | 16 |
HOUR | 小时(0-23) | 14 |
MINUTE | 分钟 | 30 |
SECOND | 秒 | 45.6 |
QUARTER | 季度(1-4) | 2 |
WEEK | 年周数(1-53) | 34 |
DOW | 星期几(0-6,0=周日) | 3 |
DOY | 年中的第几天(1-366) | 227 |
三、3个实战案例(可直接复制使用)
案例1:电商订单按月统计
-- 统计2025年各月订单量
SELECT
EXTRACT(YEAR FROM order_time) AS 年份,
EXTRACT(MONTH FROM order_time) AS 月份,
COUNT(*) AS 订单量
FROM orders
WHERE order_time >= '2025-01-01'
GROUP BY 1, 2
ORDER BY 1, 2;
案例2:计算用户精确年龄
-- 精确到天的年龄计算
SELECT
name,
EXTRACT(YEAR FROM age(birthday)) AS 岁数,
EXTRACT(MONTH FROM age(birthday)) AS 月份数
FROM users;
案例3:分析用户活跃时间段
-- 按小时统计用户活跃度
SELECT
EXTRACT(HOUR FROM login_time) AS 小时,
COUNT(*) AS 登录次数
FROM user_logins
GROUP BY 1
ORDER BY 2 DESC;
四、新手避坑指南(血泪经验总结)
陷阱1:大小写敏感问题
❌ 错误写法:
SELECT extract(year from now()); -- 可能报错
✅ 正确写法:
SELECT EXTRACT(YEAR FROM NOW()); -- 单位必须大写
陷阱2:时区问题处理
-- 带时区的时间提取
SELECT
EXTRACT(HOUR FROM CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Shanghai') AS 北京时间
五、扩展知识:EXTRACT的兄弟函数
函数 | 特点 | 示例 |
---|---|---|
DATE_PART | 功能与EXTRACT完全相同 | DATE_PART('dow', NOW()) |
TO_CHAR | 返回字符串,可格式化输出 | TO_CHAR(NOW(), 'YYYY-MM') |
六、总结与作业练习
EXTRACT函数三大优势:
-
精准提取时间要素🔍
-
支持丰富的单位选项📚
-
兼容ISO标准,跨数据库通用🌐
小贴士:收藏本文案例,下次遇到时间处理需求时,直接CTRL+F搜索需要的时间单位即可快速实现!