在 SQL 中获取当月的最后一天

Posted

技术标签:

【中文标题】在 SQL 中获取当月的最后一天【英文标题】:Get the last day of the month in SQL 【发布时间】:2010-11-06 07:03:17 【问题描述】:

我需要在 SQL 中以日期的形式给出该月的最后一天。如果我有一个月的第一天,我可以这样做:

DATEADD(DAY, DATEADD(MONTH,'2009-05-01',1), -1)

但是有谁知道如何概括它,以便我可以找到任何给定日期的一个月的最后一天?

【问题讨论】:

为什么这个查询不通用? 【参考方案1】:

从 SQL Server 2012 开始,您可以使用 EOMONTH 函数。

返回包含指定日期的月份的最后一天, 带有可选的偏移量。

语法

EOMONTH ( start_date [, month_to_add ] ) 

如何...我可以找到任何给定日期的一个月的最后一天?

SELECT EOMONTH(@SomeGivenDate)

【讨论】:

【参考方案2】:

这是我的版本。无需字符串操作或强制转换,只需调用 DATEADDYEARMONTH 函数:

DECLARE @test DATETIME
SET @test = GETDATE()  -- or any other date

SELECT DATEADD(month, ((YEAR(@test) - 1900) * 12) + MONTH(@test), -1)

【讨论】:

我不明白这个查询如何返回一个月的最后一天,尽管它当然可以。请您进一步解释一下吗? 如果您使用 SQL Server >= 2012,则使用 E​​OMONTH(请参阅 Martin Smith 的答案) 该解决方案以 SQL Server 的第一个已知日期 (1900-01-01) 为基础。然后它通过四个步骤计算到您的给定日期(@test)已经过去的月数: 1. 计算已经过去了多少年:给定年份 - 1900 2. 将步骤 1 的结果乘以 12 将其转换为月3. 将给定日期的月份添加到步骤 2 的结果中 4. 最后使用 DATEADD 函数将幻数转换为 DATETIME 删除一个月【参考方案3】:

您可以使用DAY() 函数获取日期中的天数:

dateadd(day, -1, dateadd(month, 1, dateadd(day, 1 - day(date), date)))

【讨论】:

Msg 8116, Level 16, State 1, Line 1 参数数据类型 varchar 对于 dateadd 函数的参数 2 无效。 我为你修正了语法。 DATEADD 是(datepart, distance, date)【参考方案4】:

在 SQL 服务器中工作

Declare @GivenDate datetime
SET @GivenDate = GETDATE()

Select DATEADD(MM,DATEDIFF(MM, 0, @GivenDate),0) --First day of the month 

Select DATEADD(MM,DATEDIFF(MM, -1, @GivenDate),-1) --Last day of the month

【讨论】:

一个月的第一个日期(不是一天)总是 01。为什么需要一个函数来找到它?【参考方案5】:

我知道这是一个老问题,但这是另一个适合我的解决方案

SET @dtDate = "your date"
DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0))

如果有人正在寻找不同的例子,这里是一个链接http://blog.sqlauthority.com/2007/08/18/sql-server-find-last-day-of-any-month-current-previous-next/

我希望这对其他人有所帮助。 堆栈溢出岩石!!!!

【讨论】:

【参考方案6】:

根据陈述:

SELECT DATEADD(MONTH, 1, @x)           -- Add a month to the supplied date @x

SELECT DATEADD(DAY,  0 - DAY(@x), @x)  -- Get last day of month previous to the supplied date @x

如何添加一个月到日期@x,然后检索前一个月的最后一天(即提供日期的月份的最后一天)

DECLARE @x  DATE = '20-Feb-2012' 
SELECT DAY(DATEADD(DAY,  0 - DAY(DATEADD(MONTH, 1, @x)), DATEADD(MONTH, 1, @x)))

注意:这是使用 SQL Server 2008 R2 进行的测试

【讨论】:

【参考方案7】:

对于 SQL server 2012 或更高版本,使用 EOMONTH 获取月份的最后日期

显示当月结束日期的SQL查询

DECLARE @currentDate DATE = GETDATE()
SELECT EOMONTH (@currentDate) AS CurrentMonthED

SQL查询显示下个月的结束日期

DECLARE @currentDate DATE = GETDATE()
SELECT EOMONTH (@currentDate, 1 ) AS NextMonthED

【讨论】:

【参考方案8】:

稍微扩展你的公式:

dateadd(day, -1,
    dateadd(month, 1,
        cast(month('5/15/2009') as varchar(2)) + 
        '/1/' + 
        cast(year('5/15/2009') as varchar(4)))

【讨论】:

【参考方案9】:

这适用于我,使用 Microsoft SQL Server 2005:

DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'2009-05-01')+1,0))

【讨论】:

【参考方案10】:

WinSQL 获取上个月的最后一天(即今天是 2017-02-09,返回 2017-01-31: 选择 dateadd(day,-day(today()),today())

【讨论】:

【参考方案11】:

尝试运行以下查询,它将为您提供所需的一切:)

Declare @a date =dateadd(mm, Datediff(mm,0,getdate()),0)
Print('First day of Current Month:')
Print(@a)
Print('')
set @a = dateadd(mm, Datediff(mm,0,getdate())+1,-1)
Print('Last day of Current Month:')
Print(@a)
Print('')

Print('First day of Last Month:')
set @a = dateadd(mm, Datediff(mm,0,getdate())-1,0)
Print(@a)
Print('')

Print('Last day of Last Month:') 
set @a = dateadd(mm, Datediff(mm,0,getdate()),-1)
Print(@a)
Print('')


Print('First day of Current Week:')
set @a = dateadd(ww, Datediff(ww,0,getdate()),0)
Print(@a)
Print('')

Print('Last day of Current Week:')
set @a = dateadd(ww, Datediff(ww,0,getdate())+1,-1)
Print(@a)
Print('')

Print('First day of Last Week:')
set @a =  dateadd(ww, Datediff(ww,0,getdate())-1,0)
Print(@a)
Print('')

Print('Last day of Last Week:')
set @a =  dateadd(ww, Datediff(ww,0,getdate()),-1)
Print(@a)

【讨论】:

【参考方案12】:

WinSQL:我想返回上个月的所有记录:

where DATE01 between dateadd(month,-1,dateadd(day,1,dateadd(day,-day(today()),today()))) and dateadd(day,-day(today()),today())

这做同样的事情:

where month(DATE01) = month(dateadd(month,-1,today())) and year(DATE01) = year(dateadd(month,-1,today()))

【讨论】:

【参考方案13】:

也可以使用这个查询。

DECLARE @SelectedDate DATE =  GETDATE()

SELECT DATEADD(DAY, - DAY(@SelectedDate), DATEADD(MONTH, 1 , @SelectedDate)) EndOfMonth

【讨论】:

【参考方案14】:

我的 2 美分:

select DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(day,(0-(DATEPART(dd,'2008-02-12')-1)),'2008-02-12')))

拉吉

【讨论】:

【参考方案15】:

使用 sql server 2005,这对我有用:

select dateadd(dd,-1,dateadd(mm,datediff(mm,0,YOUR_DATE)+1,0))

基本上,您会得到 YOUR_DATE 从 (SQL Server) 时间开始的月数。然后加一个得到下个月的序号。然后将此月数添加到 0 以获得下个月第一天的日期。然后,您从中减去一天以得到 YOUR_DATE 的最后一天。

【讨论】:

【参考方案16】:

取一些基准日期,即某个月的 31 日,例如'20011231'。然后使用 以下过程(我在下面给出了 3 个相同的示例,只有 @dt 值不同)。

declare @dt datetime;

set @dt = '20140312'

SELECT DATEADD(month, DATEDIFF(month, '20011231', @dt), '20011231');



set @dt = '20140208'

SELECT DATEADD(month, DATEDIFF(month, '20011231', @dt), '20011231');



set @dt = '20140405'

SELECT DATEADD(month, DATEDIFF(month, '20011231', @dt), '20011231');

【讨论】:

【参考方案17】:

使用 SQL Server,这是另一种查找月份最后一天的方法:

SELECT DATEADD(MONTH,1,GETDATE())- day(DATEADD(MONTH,1,GETDATE()))

【讨论】:

【参考方案18】:

我写了以下函数,它可以工作。

它返回日期时间数据类型。零时、分、秒、毫秒。

CREATE Function [dbo].[fn_GetLastDate]
(
    @date datetime
)
returns datetime
as
begin

declare @result datetime

 select @result = CHOOSE(month(@date),  
 DATEADD(DAY, 31 -day(@date), @date),
 IIF(YEAR(@date) % 4 = 0, DATEADD(DAY, 29 -day(@date), @date), DATEADD(DAY, 28 -day(@date), @date)), 
 DATEADD(DAY, 31 -day(@date), @date) ,
 DATEADD(DAY, 30 -day(@date), @date), 
 DATEADD(DAY, 31 -day(@date), @date),
 DATEADD(DAY, 30 -day(@date), @date), 
 DATEADD(DAY, 31 -day(@date), @date),
 DATEADD(DAY, 31 -day(@date), @date),
 DATEADD(DAY, 30 -day(@date), @date),
 DATEADD(DAY, 31 -day(@date), @date),
 DATEADD(DAY, 30 -day(@date), @date), 
 DATEADD(DAY, 31 -day(@date), @date))

 return convert(date, @result)

end

它非常易于使用。 2 示例:

select [dbo].[fn_GetLastDate]('2016-02-03 12:34:12')

select [dbo].[fn_GetLastDate](GETDATE())

【讨论】:

当您可以将 EOMONTH 转换为 DATETIME 时,您到底为什么要编写自己的函数来执行此操作? select [dbo].[fn_GetLastDate]('1900-02-03') 不会返回正确的结果。 马丁,你是对的。我不想给世界提供替代建议:)。只是,我在Sql server 2012版本之前需要这个功能。 它在 2012 年之前的版本上不起作用,因为它使用 CHOOSE。【参考方案19】:

根据以下链接中投票最多的答案,我提出了以下解决方案:

 declare  @mydate date= '2020-11-09';
  SELECT DATEADD(month, DATEDIFF(month, 0, @mydate)+1, -1) AS lastOfMonth

链接:How can I select the first day of a month in SQL?

【讨论】:

【参考方案20】:

我找不到在常规 SQL 中有效的答案,所以我强行回答:

SELECT *
FROM orders o
WHERE (MONTH(o.OrderDate) IN ('01','03','05','07','08','10','12') AND DAY(o.OrderDate) = '31')
    OR (MONTH(o.OrderDate) IN ('04','06','09','11') AND DAY(o.OrderDate) = '30')
    OR (MONTH(o.OrderDate) IN ('02') AND DAY(o.OrderDate) = '28')

【讨论】:

【参考方案21】:
---Start/End of previous Month 
Declare @StartDate datetime, @EndDate datetime

set @StartDate = DATEADD(month, DATEDIFF(month, 0, GETDATE())-1,0) 
set @EndDate = EOMONTH (DATEADD(month, DATEDIFF(month, 0, GETDATE())-1,0)) 

SELECT @StartDate,@EndDate

【讨论】:

以上是关于在 SQL 中获取当月的最后一天的主要内容,如果未能解决你的问题,请参考以下文章

如何用sql获取上个月的第一天和上个月的最后一天

SQL语句 如何取得指定月份的最后一天的日期

sql 语句 怎么获取指定月的第一天和最后一天?

获取当月的第一天和最后一天示例

java获取当月的第一天和最后一天,获取本周的第一天和最后一天

sql如何取某年某月的第一天和最后一天