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

wjwdive 2014-03-15 11:29:14
求教,能给出注释更好
...全文
10751 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
莴笋Ho 2015-10-23
  • 打赏
  • 举报
回复
/* author OceanHo @ 2015-10-23 10:14:21 获取指定时间字符串指定日期的月最后一天日期 */ IF OBJECT_ID('get_LastDayDate') IS NOT NULL DROP FUNCTION get_LastDayDate GO CREATE FUNCTION get_LastDayDate(@dateString NVARCHAR(25)) RETURNS DATETIME AS BEGIN SELECT @dateString = DATEADD( /** 将参数3指定的时间加上参数2的天数 **/ DAY, /** 例如:@dateString = 2015-10-23 23:59:59 获取 @dateString 的时间 天 部分,因为第三个参数,把@dateString加了一个月,得到的时间就是 2015-11-23 23:59:59 这个时间的 DAY 部分,也就是 23 就是下个月 1-23号的天数,第三个参数 减去 这个天数,得到的就是前一个月的最后一天 **/ -(DATEPART(DAY,@dateString)), /* 将@date 加上一个月,得到的就是下个月的今天的具体时间 */ DATEADD(MONTH,1,@dateString) ) RETURN @dateString END GO -- 测试调用 SELECT dbo.get_LastDayDate(GETDATE()) AS 本月最后一天日期 SELECT dbo.get_LastDayDate(N'2015-02-05') AS 二月份最后一天日期
發糞塗牆 2014-03-16
  • 打赏
  • 举报
回复
引用 2 楼 u014138112 的回复:
不太懂啊, last_day(to_date('2014-03-15','yyyy-mm-dd')) 和这个有什么不同啊 还有我们一定要用19991231这天作为基准吗?这样做是不是麻烦了? 多谢指教
你就把变量改改就行了,last_day在sqlserver中没有这个函数,你这个貌似是Oracle的吧?19991231这个只是基准,可以不用,你可以自己改一下,另外你先说清楚你要在Oracle运行的还是sqlserver的,
LongRui888 2014-03-16
  • 打赏
  • 举报
回复
引用 6 楼 u014138112 的回复:
你就把变量改改就行了,last_day在sqlserver中没有这个函数,你这个貌似是Oracle的吧?19991231这个只是基准,可以不用,你可以自己改一下,另外你先说清楚你要在Oracle运行的还是sqlserver的,
谢谢啦,用的SQLServer2008R2[/quote] 试试这个:
select dateadd(day,-1,dateadd(month,1,'2008-06'+'-01'))
/*
2008-06-30 00:00:00.000
*/
wjwdive 2014-03-16
  • 打赏
  • 举报
回复
不太懂啊, last_day(to_date('2014-03-15','yyyy-mm-dd')) 和这个有什么不同啊 还有我们一定要用19991231这天作为基准吗?这样做是不是麻烦了? 多谢指教
wjwdive 2014-03-16
  • 打赏
  • 举报
回复
你就把变量改改就行了,last_day在sqlserver中没有这个函数,你这个貌似是Oracle的吧?19991231这个只是基准,可以不用,你可以自己改一下,另外你先说清楚你要在Oracle运行的还是sqlserver的,[/quote] 谢谢啦,用的SQLServer2008R2
LongRui888 2014-03-16
  • 打赏
  • 举报
回复
引用 2 楼 u014138112 的回复:
不太懂啊, last_day(to_date('2014-03-15','yyyy-mm-dd')) 和这个有什么不同啊 还有我们一定要用19991231这天作为基准吗?这样做是不是麻烦了? 多谢指教
你用的是oracle吗
唐诗三百首 2014-03-16
  • 打赏
  • 举报
回复

-- 建函数
create function dbo.fn_getmonthlastday
(@y int, --> 指定年份
 @m int  --> 指定月份
) returns varchar(20)
as
begin
 declare @x varchar(20)

 select @x=convert(varchar,
                   dateadd(d,-1,dateadd(m,1,rtrim(@y)+'-'+rtrim(@m)+'-01')),
                   111)

 return @x
end
 

-- 测试1
select dbo.fn_getmonthlastday(2014,3) '月份最后一天'
/*
月份最后一天
--------------------
2014/03/31

(1 row(s) affected)
*/


-- 测试2
select dbo.fn_getmonthlastday(2014,2) '月份最后一天'
/*
月份最后一天
--------------------
2014/02/28

(1 row(s) affected)
*/


-- 测试3
select dbo.fn_getmonthlastday(2013,12) '月份最后一天'
/*
月份最后一天
--------------------
2013/12/31

(1 row(s) affected)
*/
直面人生 2014-03-16
  • 打赏
  • 举报
回复
select DATEADD(MONTH,DATEDIFF(MONTH,'20130101',GETDATE()),'20130101') 详细解释: select CONVERT(varchar(8),GETDATE(),120)+'01' --2014-03-01 select CONVERT(datetime,CONVERT(varchar(8),GETDATE(),120)+'01',120) --2014-03-01 00:00:00.000 --2. 显示本月最后一天 select dateadd(day,-1,convert(datetime,convert(varchar(8),dateadd(month,1,getdate()),120)+'01',120)) SELECT dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0)) --本月最后一天最好的sql语句-- select DATEADD(MONTH,DATEDIFF(MONTH,'19911231',GETDATE()),'19911231') 详细解释: select DATEDIFF(MONTH,'19911231',GETDATE()) --267 select DATEADD(MONTH,DATEDIFF(MONTH,'19911231',GETDATE()),'19911231') --2014-03-31 00:00:00.000 这个表达式是先以月为单位,以某个月的最后一天为锚点日期,(19911231), 计算它和给定日期的差值,把这个差值记为 diff ,之后再把 diff个月加到锚点日期上,就得到了给定日期所在月份的最后一天 锚点日期可以换,不过必须是某月的最后一天
wjwdive 2014-03-16
  • 打赏
  • 举报
回复
现在了解了一点,再次感谢各位大神的热心帮助
發糞塗牆 2014-03-15
  • 打赏
  • 举报
回复
DECLARE @a DATETIME
SET @a='2014-03-15'
 SELECT DATEADD(month, DATEDIFF(month, '19991231', @a), '19991231');

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧