MSSQL 快速确定某月份末尾日期

介绍

在MSSQL中,获取某个月份的末尾日期是一个非常常见的需求,特别是在需要生成一些财务或报表文件的时候。一般来说,我们可以使用DATEADD和DATEDIFF函数来得到需要的结果。

使用DATEADD和DATEDIFF函数

我们可以使用DATEDIFF函数来获取某个日期与1900年1月1日之间的天数,进而计算出需要的月份的天数。假设我们需要获取2019年8月份的末尾日期,可以使用以下SQL语句:

SELECT DATEADD(MILLISECOND,-3,DATEADD(MONTH, DATEDIFF(MONTH,0,'2019-08-01')+1,0))

执行以上查询,可以得到结果为:

2019-08-31 23:59:59.997

这里我们使用了DATEADD函数来进行时间的计算,将指定日期的月份加1,得到下一个月。同时使用DATEDIFF函数获取2019年8月份与1900年1月1日之间的天数,这个值将会是本月的日期数。最终将这个得到的结果减去3毫秒,得到本月的最后一天最后一秒的时间。

使用EOMONTH函数

MSSQL 2012开始,我们可以使用EOMONTH函数来更加方便的获取某个月份的末尾日期。假如我们需要获取2020年2月份的末尾日期,可以使用以下SQL语句:

SELECT EOMONTH('2020-02-01')

执行以上查询,可以得到结果为:

2020-02-29

EOMONTH函数的使用方法非常简单,只需要传入一个日期,函数会自动计算它所在的月份的末尾日期。

使用DATEFROMPARTS函数

在MSSQL 2012之前,我们无法使用EOMONTH函数来获取某个月份的末尾日期。这时,我们可以使用DATEFROMPARTS函数,将我们想要的年份、月份、日期组合起来,得到所需的结果。以下是一个使用DATEFROMPARTS函数的例子:

SELECT DATEADD(DAY,-1,DATEFROMPARTS(2018,11,1))

执行以上查询,可以得到结果为:

2018-11-30

上面的例子中,我们使用DATEFROMPARTS函数传入了年份2018、月份11和日期1,得到了2018年11月1日。然后使用DATEADD函数将其加上11月份的天数,并减去1天,得到2018年11月份的最后一天。

总结

使用DATEADD和DATEDIFF函数以及EOMONTH函数和DATEFROMPARTS函数都可以完成获取某个月份的末尾日期这一需求,不过使用EOMONTH函数最为简便。

数据库标签