如何从SQL提取年或月数据_运用YEAR与MONTH提取函数

MySQL的YEAR()和MONTH()是标量函数,仅接受DATE/DATETIME/TIMESTAMP类型参数并返回整数,不支持字符串日期或格式化参数;PostgreSQL需用EXTRACT(YEAR FROM col)::INT;WHERE中避免对字段用YEAR/MONTH,应改写为范围查询以走索引。YEAR 和 MONTH 函数在 MySQL 里怎么用直接说结论:MySQL 的 YEAR() 和 MONTH() 是标量函数,只接受一个 DATE、DATETIME 或 TIMESTAMP 类型的参数,返回整数。它们不支持字符串格式的日期(比如 '2024-03'),也不接受格式化参数。常见错误现象:YEAR('2024-03') 看似合理,但实际返回 2024 ------ 因为 MySQL 会隐式把字符串转成日期,而 '2024-03' 被当成 '2024-03-01';更危险的是 YEAR('2024/03'),可能转成 0000 或报警告,取决于 SQL 模式。必须确保字段或表达式结果是合法日期类型,不是字符串如果源字段是 VARCHAR 存的 '2024-03-15',得先用 STR_TO_DATE(col, '%Y-%m-%d') 转换,再套 YEAR()MONTH() 返回 1--12,不是 00--12;想补零得自己用 LPAD(MONTH(date_col), 2, '0')PostgreSQL 里没有 YEAR/MONTH 函数,怎么办PostgreSQL 不提供 YEAR() 或 MONTH(),直接调用会报错:ERROR: function year(timestamp without time zone) does not exist。它用的是标准 SQL 的 EXTRACT() 函数。使用场景:你想从 created_at 字段里取年份做分组统计,或者筛选某个月的数据。取年份:用 EXTRACT(YEAR FROM created_at),返回 double precision 类型,常需转成整数:EXTRACT(YEAR FROM created_at)::INT取月份:用 EXTRACT(MONTH FROM created_at)::INT,返回 1--12注意时区影响:created_at 是 TIMESTAMP WITH TIME ZONE 时,EXTRACT 按当前会话时区计算,不是存储时区性能提示:对 EXTRACT(YEAR FROM col) 做 WHERE 或 GROUP BY,无法走普通 B-tree 索引,需要函数索引,比如 CREATE INDEX idx_orders_year ON orders ((EXTRACT(YEAR FROM order_date)::INT));WHERE 条件里用 YEAR/MONTH 容易慢,怎么优化直接写 WHERE YEAR(order_date) = 2024 看似简洁,但几乎所有数据库都会放弃索引扫描,变成全表扫描------因为函数作用于字段,破坏了索引的有序性。 标贝科技 标贝科技-专业AI语音服务的人工智能开放平台

相关推荐
斑马1394 小时前
Linux软件编程学习笔记(十三)——数据库
数据库·oracle
初願致夕霞4 小时前
MySQL_索引
数据库·mysql
linweidong4 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手4 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小玮看世界4 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
萧鼎4 小时前
2026实战:用 tomlkit 优雅读写 TOML 配置,告别手写解析器
python·开源·教程·python库
十六年开源服务商4 小时前
2026网站备份方案完整指南
数据库·oracle
小刘在重生~5 小时前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
一只小李郁vickie5 小时前
mysql 开启压缩传输3402条数据2.1秒压缩到毫秒级
数据库·mysql
2601_962099465 小时前
Python xlwt设置excel单元格字体及格式
python·excel·xlwt·样式设置·单元格格式