在 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】:这是我的版本。无需字符串操作或强制转换,只需调用 DATEADD
、YEAR
和 MONTH
函数:
DECLARE @test DATETIME
SET @test = GETDATE() -- or any other date
SELECT DATEADD(month, ((YEAR(@test) - 1900) * 12) + MONTH(@test), -1)
【讨论】:
我不明白这个查询如何返回一个月的最后一天,尽管它当然可以。请您进一步解释一下吗? 如果您使用 SQL Server >= 2012,则使用 EOMONTH(请参阅 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 中获取当月的最后一天的主要内容,如果未能解决你的问题,请参考以下文章