2009-06-26 137 views
37

我需要获取在SQL中作为日期给出的月份的最后一天。如果我有一个月的第一天,我可以做这样的事情:在SQL中获取每月的最后一天

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

但没有人知道如何来概括它,所以我可以找到该月的最后一天,对于任何给定日期?

回答

50

这里是我的版本。没有字符串操作或铸件所需,每次只需一个电话到DATEADDYEARMONTH功能:

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

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

只需扩展您的公式了一点点:

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

的LAST_DAY函数工作得很好这一点。

编辑:其实正如评论中提到的,这可能不适用于所有的SQL。我将离开帖子,希望有人在寻找MySQL/Oracle的答案时磕磕绊绊。

mysql reference manual

LAST_DAY(date) 

获取一个日期或日期时间值,并返回该月的最后一天对应的值。如果参数无效,则返回NULL。

mysql> SELECT LAST_DAY('2003-02-05'); 
     -> '2003-02-28' 
mysql> SELECT LAST_DAY('2004-02-05'); 
     -> '2004-02-29' 
mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); 
     -> '2004-01-31' 
mysql> SELECT LAST_DAY('2003-03-32'); 
     -> NULL 

LAST_DAY()自MySQL 4.1.1起可用。

+0

刚刚oracle呢? – 2009-06-26 22:14:22

+1

-1:LAST_DAY不是T-SQL。不过,它在Oracle和MySQL中可用。 – Eric 2009-06-26 22:14:23

+0

在SQL Server中? (标签) – 2009-06-26 22:14:42

11

你可以通过使用DAY()功能得到日期的日子:

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

我的2美分:

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

拉吉

40

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

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

语法

EOMONTH (start_date [, month_to_add ]) 

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

SELECT EOMONTH(@SomeGivenDate) 
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

0

使用SQL Server 2005,这个工作对我来说:

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

基本上,你从(SQL服务器年初获得的月数)时间为YOUR_DATE。然后添加一个来获得下个月的序列号。然后将这个月数加到0来得到下个月第一天的日期。然后,您减去一天即可抵达YOUR_DATE的最后一天。

1

使用SQL Server,这里是另一种方式来发现我们每月的最后一天:

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

这个工作对我来说,使用Microsoft SQL Server 2005:

DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'2009-05-01')+1,0)) 
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'); 
1

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

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

对于SQL服务器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 
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()) 
相关问题