2009-06-26 98 views
37

Tôi cần lấy ngày cuối cùng của tháng được cho là ngày trong SQL. Nếu tôi có ngày đầu tiên của tháng, tôi có thể làm một cái gì đó như thế này:Lấy ngày cuối cùng của tháng trong SQL

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

Nhưng không ai biết làm thế nào để khái quát nó để tôi có thể tìm thấy những ngày cuối cùng của tháng cho bất cứ ngày?

Trả lời

50

Dưới đây là phiên bản của tôi. Không chuỗi thao tác hoặc đúc yêu cầu, mỗi chỉ là một cuộc gọi đến các chức năng DATEADD, YEARMONTH:

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

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

Rất đẹp! Thanks :) –

2

Chỉ cần mở rộng công thức của bạn ra một chút:

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

chức năng Các LAST_DAY hoạt động độc đáo cho việc này.

Chỉnh sửa: Thực ra như đã đề cập trong nhận xét, điều này có thể không dành cho tất cả SQL. Tôi sẽ để lại các bài viết trong khả năng của một ai đó đang tìm kiếm một câu trả lời MySQL/Oracle vấp vào nó.

Từ mysql reference manual:

LAST_DAY(date) 

Mất một ngày hoặc datetime giá trị và trả về giá trị tương ứng cho ngày cuối cùng của tháng. Trả về NULL nếu đối số không hợp lệ.

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() có sẵn dưới dạng MySQL 4.1.1.

+0

chỉ là oracle? –

+1

-1: LAST_DAY không phải là T-SQL. Nó có sẵn trong Oracle và MySQL, mặc dù. – Eric

+0

Trong SQL Server? (tags) –

11

Bạn có thể nhận các ngày trong ngày bằng cách sử dụng các chức năng DAY():

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

Cách tiếp cận thông minh) – Eric

+0

Msg 8116, Cấp 16, Tiểu bang 1, Dòng 1 VARCHLoại dữ liệu đối số không hợp lệ đối số 2 của hàm dateadd – Raj

+0

DATEADD là '(datepart, distance, date)'. – Eric

0

My 2 cents:

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

Raj

40

Từ SQL Server 2012, bạn có thể sử dụng chức năng EOMONTH.

Trả về ngày cuối cùng của tháng có chứa ngày được chỉ định, có bù đắp tùy chọn.

Cú pháp

EOMONTH (start_date [, month_to_add ]) 

Làm thế nào ... Tôi có thể tìm thấy những ngày cuối cùng của tháng cho bất cứ ngày?

SELECT EOMONTH(@SomeGivenDate) 
+1

Ha, Denali không tồn tại trong 09;) +1 anyways. –

+3

+1 cho cách làm mới gợi cảm trong SQL Server, đó là cách cũ trong Excel! –

3

Dựa trên các báo cáo:

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 

thế nào về việc thêm một tháng đến nay @x và sau đó lấy ngày cuối cùng của tháng trước đó (ví dụ: Ngày cuối cùng của tháng được cung cấp)

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

Lưu ý: Đây là thử nghiệm sử dụng SQL Server 2008 R2

0

sử dụng SQL Server 2005, công trình này cho tôi:

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

Về cơ bản, bạn sẽ có được số tháng từ đầu (SQL Server) thời gian cho YOUR_DATE. Sau đó, thêm một vào nó để có được số thứ tự của tháng tiếp theo. Sau đó, bạn thêm số tháng này vào 0 để có được một ngày là ngày đầu tiên của tháng tiếp theo. Từ đó, bạn trừ đi một ngày để đến ngày cuối cùng của YOUR_DATE.

1

Sử dụng SQL Server, đây là một cách khác để tìm ngày cuối cùng của tháng:

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

Tôi biết đây là một câu hỏi cũ nhưng đây là một giải pháp mà làm việc cho tôi

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

Và nếu một số người đang tìm kiếm các ví dụ khác nhau ở đây là một liên kết http://blog.sqlauthority.com/2007/08/18/sql-server-find-last-day-of-any-month-current-previous-next/

Tôi hy vọng điều này sẽ giúp ích cho người khác. stackoverflow Rocks !!!!

0

này làm việc cho tôi, sử dụng Microsoft SQL Server 2005:

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

Đi một số ngày cơ sở đó là ngày 31 của một số tháng ví dụ '20011231'. Sau đó, sử dụng quy trình sau
(Tôi đã đưa ra 3 ví dụ giống hệt nhau bên dưới, chỉ giá trị @dt khác).

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 để có được ngày cuối cùng của tháng trước (i.e hôm nay là 2017-02-09, trả về 2017-01-31: Chọn dateadd (ngày, -day (today()), today())

1

Hãy thử chạy truy vấn sau, nó sẽ cung cấp cho bạn mọi thứ bạn muốn :)

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: tôi muốn trả lại toàn bộ hồ sơ cho tháng cuối cùng:

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

này làm điều tương tự:

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

Đối với SQL server 2012 hoặc sử dụng trên truy vấn EOMONTH to get the last date of month

SQL để hiển thị ngày kết thúc của tháng hiện tại

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

truy vấn SQL để hiển thị ngày cuối tháng kế tiếp

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

tôi đã viết như sau chức năng, nó hoạt động.

Nó trả về kiểu dữ liệu datetime. Không giờ, phút, giây, miliseconds.

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 

Rất dễ sử dụng. 2 ví dụ:

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

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

Tại sao bạn lại viết chức năng của riêng mình để thực hiện việc này khi bạn có thể truyền EOMONTH đến DATETIME? chọn [dbo]. [fn_GetLastDate] ('1900-02-03') Sẽ không trả lại kết quả chính xác. –

+0

Martin, bạn nói đúng. Tôi không muốn đưa ra lời khuyên thay thế cho thế giới :). Chỉ cần, tôi cần chức năng này trước phiên bản Sql server 2012. –

+0

Nó sẽ không hoạt động trên các phiên bản trước năm 2012 vì nó sử dụng CHỌN. –

Các vấn đề liên quan