如何从SQL提取年或月数据_运用YEAR与MONTH提取函数
MySQL的YEAR()和MONTH()是标量函数仅接受DATE/DATETIME/TIMESTAMP类型参数并返回整数不支持字符串日期或格式化参数PostgreSQL需用EXTRACT(YEAR FROM col)::INTWHERE中避免对字段用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语音服务的人工智能开放平台