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

时间:2009-06-26 22:09:17

标签: sql sql-server tsql

我需要将当月的最后一天作为SQL中的日期。如果我有这个月的第一天,我可以这样做:

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

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

21 个答案:

答案 0 :(得分:57)

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

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

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

答案 1 :(得分:56)

从SQL Server 2012,您可以使用EOMONTH功能。

  

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

<强>语法

EOMONTH ( start_date [, month_to_add ] ) 
  

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

SELECT EOMONTH(@SomeGivenDate)

答案 2 :(得分:13)

您可以使用DAY()功能获取日期:

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

答案 3 :(得分:4)

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

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/

我希望这有助于其他人。 stackoverflow Rocks !!!!

答案 4 :(得分:3)

基于陈述:

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进行测试

答案 5 :(得分:2)

稍等一下你的公式:

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

答案 6 :(得分:2)

在SQL Server中工作

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

答案 7 :(得分:2)

对于SQL Server 2012或更高版本,请使用 EOMONTH to get the last date of month

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

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

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

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

答案 10 :(得分:1)

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

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)

答案 11 :(得分:1)

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()))

答案 12 :(得分:0)

基于下面链接中投票率最高的答案,我提出了以下解决方案:

 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?

答案 13 :(得分:0)

也可以使用此查询。

DECLARE @SelectedDate DATE =  GETDATE()

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

答案 14 :(得分:0)

我写了以下功能,它有效。

返回datetime数据类型。零小时,分钟,秒,毫秒。

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())

答案 15 :(得分:0)

取一些基准日期,即某个月的第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');

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

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

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

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

答案 18 :(得分:0)

如果您经常需要它,请将其包装在内联TVF中,速度非常快:

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/21/calculating-third-wednesday-of-the-month-with-inline-udfs.aspx

答案 19 :(得分:0)

我的2美分:

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

拉​​吉

答案 20 :(得分:-1)

---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