一个面试题,怎么解最好?

芒果仔 2012-07-04 11:12:58
题目:
请写一个SQL语句,能获取任意日期的当月最后一天
比如,@today = '2012/3/7',则显示结果为:2012/3/31

我的写法:

declare @today datetime
set @today = GETDATE()

select DATEADD(DD,-DAY(@today),DATEADD(MM,1,@today))


大家有没有更好更简便的方法?
...全文
323 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
姜大牙 2012-07-10
  • 打赏
  • 举报
回复
写的好,我也学习一下。
CainLai 2012-07-09
  • 打赏
  • 举报
回复
一个月的最后一天,永远是下个月的第一天的前一天,下个月的第一天永远都是1号,所以就定了:

DATEADD(Day , -1 , CONVERT(NVARCHAR(6) , DATEADD(Month , 1 , GETDATE()) , 112) + '01')
yhnujm##33 2012-07-09
  • 打赏
  • 举报
回复
其实知道在运算时
0代表1900-01-01 00:00:00.000
-1代表1899-12-31 00:00:00.000
就不是问题了   
lycorisraya 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

SQL code
SELECT DATEADD(mm,DATEDIFF(MM,0,GETDATE())+1,-1)


你写的挺好的啊
[/Quote]
这种方法比较巧妙,也是类似于下个月的第一天减去一天!
以学习为目的 2012-07-09
  • 打赏
  • 举报
回复
感觉是算术问题。这肯定有多种写法,lee哥的写法比较巧妙
pengpeng409 2012-07-09
  • 打赏
  • 举报
回复
都是高手啊。。。
芒果仔 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

两种方法都非常好,但是楼主的方法是可能发生问题的,当这个月天数比下个月多的时候就没办法返回正确的结果。

举个例子

SQL code
select DATEADD(DD,-DAY(convert(date,'2011-01-30')),DATEADD(MM,1,convert(date,'2011-01-30')))


返回的就是 2011-01-29 了~希望楼主注意~

……
[/Quote]

没有注意到这一点,惭愧

多谢!
芒果仔 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

不解最好,说这个太简单了。
[/Quote]

那我估计就直接被请回家了
筱筱澄 2012-07-04
  • 打赏
  • 举报
回复
不解最好,说这个太简单了。
芒果仔 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:

引用 3 楼 的回复:

SQL code

declare @date date
set @date='2012-07-08'
select dateadd(dd,-1,CONVERT(varchar(8),dateadd(mm,1,@date),120)+'01') as lastday
/*
lastday
2012-07-31 00:……
[/Quote]

感觉你的截取日期前8位再拼一个‘01’这种写法很霸气,咔咔

菜鸟来了2022 2012-07-04
  • 打赏
  • 举报
回复
Dateadd(SS, datatime, '1970-01-01 08:00:00')
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 3 楼 的回复:

SQL code

declare @date date
set @date='2012-07-08'
select dateadd(dd,-1,CONVERT(varchar(8),dateadd(mm,1,@date),120)+'01') as lastday
/*
lastday
2012-07-31 00:00:00.000
*/

……
[/Quote]

呵呵,方法很多,只要你肯动脑筋想
芒果仔 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

SQL code

declare @date date
set @date='2012-07-08'
select dateadd(dd,-1,CONVERT(varchar(8),dateadd(mm,1,@date),120)+'01') as lastday
/*
lastday
2012-07-31 00:00:00.000
*/
[/Quote]

下月的第一天减一天,感觉这个写法也很好,学习了
芒果仔 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

这个能有啥最好的

你想多了
[/Quote]

我总是感觉有陷阱
最近恍恍惚惚的,呵呵
觉得自己基础太差,这是临时想的,可能有高手能有更好的解法
芒果仔 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

SQL code
SQL Server 日期算法

一周的第一天
select @@DATEFIRST

一个月的第一天
select dateadd(mm,datediff(mm,0,getdate()),0)

本周的星期一
select dateadd(wk,datediff(wk,0,getdate()),0)

一年的第一天
SELECT DATEADD(yy, DA……
[/Quote]

膜拜大神,学习了!

孤独加百列 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
题目:
请写一个SQL语句,能获取任意日期的当月最后一天
比如,@today = '2012/3/7',则显示结果为:2012/3/31

我的写法:

SQL code
declare @today datetime
set @today = GETDATE()

select DATEADD(DD,-DAY(@today),DATEADD(MM,1,@today))


大家……
[/Quote]
你写的就挺简单了。
筱筱澄 2012-07-04
  • 打赏
  • 举报
回复
这个能有啥最好的

你想多了
筱筱澄 2012-07-04
  • 打赏
  • 举报
回复
SELECT DATEADD(mm,DATEDIFF(MM,0,GETDATE())+1,-1)


你写的挺好的啊
  • 打赏
  • 举报
回复

declare @date date
set @date='2012-07-08'
select dateadd(dd,-1,CONVERT(varchar(8),dateadd(mm,1,@date),120)+'01') as lastday
/*
lastday
2012-07-31 00:00:00.000
*/
--小F-- 2012-07-04
  • 打赏
  • 举报
回复
SQL Server 日期算法

一周的第一天
select @@DATEFIRST

一个月的第一天
select dateadd(mm,datediff(mm,0,getdate()),0)

本周的星期一
select dateadd(wk,datediff(wk,0,getdate()),0)

一年的第一天
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

当天的零时
SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

上个月的最后一天 :本月第一天减2ms.
SELECT dateadd(ms,-2,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

本月的最后一天
SELECT dateadd(ms,-2,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

本月的第一个星期一

去掉时分秒
DATEADD(day, DATEDIFF(day,0,getdate()), 0)
显示星期几
select datename(weekday,getdate())
如何取得某个月的天数
SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))

判断是否闰年:
SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))))
when 28 then '平年' else '闰年' end
一个季度多少天
declare @m tinyint,@time smalldatetime
select @m=month(getdate())
select @m=case when @m between 1 and 3 then 1
when @m between 4 and 6 then 4
when @m between 7 and 9 then 7
else 10 end
select @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'
select datediff(day,@time,dateadd(mm,3,@time))
加载更多回复(2)

34,593

社区成员

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

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