SQL如何获取当月最后一天_使用LAST_DAY或EOMONTH函数

秋芳酱_9128

秋芳酱_9128

2026-04-13

911人浏览

原创

mysql用last_day()、sql server用eomonth()可获取当月最后一天;跨库兼容需用“下月1日减1天”逻辑,并注意时区、类型隐式转换及null处理。

sql如何获取当月最后一天_使用last_day或eomonth函数

MySQL用LAST_DAY()获取当月最后一天

MySQL 5.7+ 原生支持 LAST_DAY(),它直接接受一个日期值,返回该月最后一天的日期(含时间部分为 00:00:00)。注意:它不接受字符串字面量如 '2024-03',必须是合法日期类型。

常见错误是传入不完整日期或非法格式,比如 LAST_DAY('2024-03') 会静默转成 '2024-03-01' 再计算,结果仍是 3 月 31 日——看似对,但逻辑已偏移;若传 '2024-02-30',MySQL 会自动纠正为 '2024-03-02',再算出 3 月 31 日,完全失真。

  • 正确用法:SELECT LAST_DAY(CURDATE())、SELECT LAST_DAY('2024-03-15')
  • 想固定取“本月最后一天”,优先用 CURDATE() 或 NOW(),避免依赖用户传参格式
  • 该函数返回 DATE 类型,时区以 session time_zone 为准,跨时区部署时需确认时区设置

SQL Server用EOMONTH()获取当月最后一天

EOMONTH() 是 SQL Server 2012+ 引入的函数,比 DATEADD() + DAY() 组合更直观。它接受两个参数:起始日期和可选的月偏移量(默认 0),返回该月月末日期,时间部分恒为 00:00:00。

容易踩的坑是忽略第二个参数的默认行为——比如写 EOMONTH(GETDATE(), 1) 得到的是下月最后一天,而非本月;还有人误以为它能处理 NULL,实际会直接返回 NULL,不报错也不警告。

  • 取本月最后一天:SELECT EOMONTH(GETDATE())
  • 取上月最后一天:SELECT EOMONTH(GETDATE(), -1)
  • 输入列可能为 NULL 时,建议先用 ISNULL() 或 COALESCE() 包裹,避免整行丢失

跨数据库兼容写法:不用内置函数也能搞定

当需要同时支持 MySQL、PostgreSQL、SQL Server(旧版本)甚至 SQLite 时,LAST_DAY() 和 EOMONTH() 都不可用。此时通用思路是:先取下月第一天,再减一天。

关键差异在日期运算语法:DATE_ADD()(MySQL)、DATEADD()(SQL Server)、(col + INTERVAL '1 month')(PostgreSQL)。但最稳妥的是用标准 SQL 的 EXTRACT + 字符串拼接,虽稍重但确定可控。

  • MySQL/PostgreSQL 兼容写法:SELECT DATE_SUB(DATE_ADD(LAST_DAY(CURDATE()), INTERVAL 1 DAY), INTERVAL 1 DAY) —— 看似绕,实为兜底
  • 纯表达式(无函数依赖):SELECT CAST(EXTRACT(YEAR FROM CURRENT_DATE) || '-' || EXTRACT(MONTH FROM CURRENT_DATE) || '-01' AS DATE) + INTERVAL '1 month' - INTERVAL '1 day'(PostgreSQL 风格,MySQL 需改用 DATE_ADD)
  • SQLite 用户注意:date() 函数支持 'start of month' 和 '+1 month',组合可用:SELECT date(date('now', 'start of month'), '+1 month', '-1 day')

别忽略时区和字段类型带来的隐式转换

即使函数本身正确,结果也可能因字段类型或连接时区出错。例如,把 LAST_DAY(NOW()) 插入到 DATETIME 字段没问题,但插入 TIMESTAMP 字段时,MySQL 会按系统时区转成 UTC 存储,查询时再转回 session 时区——若应用层没对齐,显示的“最后一天”可能变成前一天的 23:00。

  • 存储前显式转时区:CONVERT_TZ(LAST_DAY(NOW()), @@session.time_zone, '+00:00')(MySQL)
  • SQL Server 中,GETDATE() 返回本地时区,SYSDATETIMEOFFSET() 才带偏移,跨时区比较务必统一基准
  • 如果目标字段是 DATE 类型,函数返回值会被自动截断时间部分,无需额外 CAST;但若字段是 VARCHAR,则可能触发隐式转换,导致索引失效或比较异常

真正麻烦的不是函数怎么写,而是你不知道它在哪一层被悄悄改了时区、截了精度、或者丢了时分秒。上线前至少用 SELECT @@time_zone 和 SELECT SQL_VARIANT_PROPERTY(…) 确认过上下文。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4063

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

851

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1049

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5921

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2843

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5900

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7881

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1070

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

932

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习