获得某个日期

zhuanshen712 2011-04-19 02:37:38
大侠们,帮个忙,我想获得1:某个日期后的第一个星期二,2:某个日期后的第一个31号,3:某个日期后的第一个28号,该怎么写sql???
如:
1:获得2011-4-19的第一个星期二(结果应为2011-4-26)
2:获得2011-4-19的第一个31号(结果应为2011-5-31,4月没有31号)
3:获得2011-4-19的第一个28号(结果应为2011-4-28,每个月都有28号)
请大家帮忙。谢谢。
...全文
298 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
oO寒枫Oo 2011-04-19
  • 打赏
  • 举报
回复

declare @dt datetime
set @dt = '2011-12-31'
SELECT case WHEN (month(@dt) in (1,3,5,8,10) and day(@dt)=31) or (month(@dt)=1 and day(@dt) in(29,30)) then dateadd(month,2,@dt)
else dateadd(month,1,@dt) end
oO寒枫Oo 2011-04-19
  • 打赏
  • 举报
回复

declare @dt datetime
set @dt = '2011-02-20'
--select month(@dt)
SELECT case WHEN month(@dt) in (1,3,5,8,10) then dateadd(month,2,@dt)
else dateadd(month,1,@dt) end
oO寒枫Oo 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zhuanshen712 的回复:]
第二个和第三个其实是拆开的,其实应该是这样:

任意给定一个天数(1~31之内的),找出某个时间之后的第一个该天。
比如可以给定29号,30号等,找出某个日期之后的第一个30号等等。。。
[/Quote]


declare @dt datetime
set @dt = '2011-02-20'

--select month(@dt)

SELECT case WHEN month(@dt) in (1,3,5,8,10,12) then dateadd(month,2,@dt)
else dateadd(month,1,@dt) end

starsuxin 2011-04-19
  • 打赏
  • 举报
回复

declare @date datetime --日期
declare @Mon int; --星期?
set @date = '2011-4-18';
set @mon=2;

--1
select
case
when @mon-DATEPART(Weekday, @date) <= 0 then dateadd(day, @mon+7-DATEPART(Weekday, @date), @date)
else dateadd(day, @mon-DATEPART(Weekday, @date), @date)
end

--2
select case when MONTH(@date) IN(1,3,5,7,8,10,12) then CONVERT(varchar(7),@date,120)+'-31'
else CONVERT(varchar(7),dateadd(month,1,@date),120)+'-31' end
--3
select case when DATEPART(DAY,@date)<28 then CONVERT(varchar(7),@date,120)+'-28'
else CONVERT(varchar(7),dateadd(month,1,@date),120)+'-28' end
oO寒枫Oo 2011-04-19
  • 打赏
  • 举报
回复

declare @dt datetime
set @dt = '2011-04-01'
--select datename(weekday,@dt)
SELECT case datename(weekday,@dt) WHEN 'Monday' then dateadd(day,1,dateadd(wk,datediff(wk,0,@dt),0))
else dateadd(day,8,dateadd(wk,datediff(wk,0,@dt),0)) end
zhuanshen712 2011-04-19
  • 打赏
  • 举报
回复
第二个和第三个其实是拆开的,其实应该是这样:

任意给定一个天数(1~31之内的),找出某个时间之后的第一个该天。
比如可以给定29号,30号等,找出某个日期之后的第一个30号等等。。。
oO寒枫Oo 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zhuanshen712 的回复:]
引用 9 楼 ssp2009 的回复:

SQL code
declare @date datetime
set @date='2011-4-19'
--第一个星期二
select dateadd(day,10-DATEPART(WEEKDAY,@date),@date)
--第一个31号
select Case when MONTH(@date) IN(1,3,5,7,8,10,……
[/Quote]
第二个 3月31号 你要得到的是 3月31 还是 5月31?
zhuanshen712 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ssp2009 的回复:]

SQL code
declare @date datetime
set @date='2011-4-19'
--第一个星期二
select dateadd(day,10-DATEPART(WEEKDAY,@date),@date)
--第一个31号
select Case when MONTH(@date) IN(1,3,5,7,8,10,12) then CONVERT(varchar(7)……
[/Quote]
这个后两个能满足要求。
oO寒枫Oo 2011-04-19
  • 打赏
  • 举报
回复
第一个:

declare @dt datetime
set @dt = '2011-04-11'

SELECT case datename(weekday,@dt) WHEN 'Monday' then dateadd(day,1,dateadd(wk,datediff(wk,0,getdate()),0))
else dateadd(day,8,dateadd(wk,datediff(wk,0,getdate()),0)) end
zhuanshen712 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwwwgou 的回复:]

SQL code
declare @date datetime
set @date = '2011-4-19'
set datefirst 1
--1:获得2011-4-19后的第一个星期二(结果应为2011-4-26)
select
case
when 2-DATEPART(Weekday, @date) <= 0 then dateadd(day, 9-DATE……
[/Quote]
第一个星期的解决了,但是第三个,好像2011-3-31得到了2011-4-27
zhuanshen712 2011-04-19
  • 打赏
  • 举报
回复
To:2楼 3楼
可能是我没说清楚,如果将当前日期设定为2011-4-18,那么应该得到2011-4-19才对,但是两位的还是得到了2011-4-26

也就是说:如果今天是周一,那么下一个周二,应该就是本周二,但是如果今天是周二或者周三周四周五周六周日,那么下一个周二只能是下周二了。
zhuanshen712 2011-04-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 orchidcat 的回复:]

SQL code
declare @i date
set @i = '2011-04-19'

SELECT DATEADD(dd,CASE (DATEPART(dw,@i) - 1) WHEN 2 THEN 7 WHEN 1 THEN 8 WHEN 3 THEN 6 WHEN 4 THEN 5
WHEN 5 THEN 4 WHEN 6 THEN 3 WHEN 7 THEN 2 END ……
[/Quote]
好像执行不了啊???
Shawn 2011-04-19
  • 打赏
  • 举报
回复
declare @date datetime
set @date = '2011-4-19'
set datefirst 1
--1:获得2011-4-19后的第一个星期二(结果应为2011-4-26)
select
case
when 2-DATEPART(Weekday, @date) <= 0 then dateadd(day, 9-DATEPART(Weekday, @date), @date)
else dateadd(day, 2-DATEPART(Weekday, @date), @date)
end
--2:获得2011-4-19后的第一个31号(结果应为2011-5-31,4月没有31号)
--???
--3:获得2011-4-19后的第一个28号(结果应为2011-4-28,每个月都有28号)
select
case
when 28-DATEPART(day, @date) > 0 then DATEADD(day, 28-DATEPART(day, @date), @date)
else DATEADD(day, 28-DATEPART(day, @date) ,DATEADD(month, 1, @date))
end
bluesmiler 2011-04-19
  • 打赏
  • 举报
回复
declare @date datetime
set @date='2011-04-19'
;with cte
as (select @date+number ddate,
DATEPART(dw,getdate()+number-1) dweek
from dbo.spt_values where type='p')

1,
select top 1 * from cte
where ddate>@date and dweek=2
order by ddate
2,
select top 1 * from cte
where ddate>@date and DATEPART(dd,ddate)=31
order by ddate
3,
select top 1 * from cte
where ddate>@date and DATEPART(dd,ddate)=28
order by ddate
快溜 2011-04-19
  • 打赏
  • 举报
回复
declare @date datetime
set @date='2011-4-19'
--第一个星期二
select dateadd(day,10-DATEPART(WEEKDAY,@date),@date)
--第一个31号
select Case when MONTH(@date) IN(1,3,5,7,8,10,12) then CONVERT(varchar(7),@date,120)+'-'+'31'
else CONVERT(varchar(7),dateadd(month,1,@date),120)+'-'+'31' end
--第一个28号
select case when DATEPART(DAY,@date)<28 then CONVERT(varchar(7),@date,120)+'-'+'28'
else CONVERT(varchar(7),dateadd(month,1,@date),120)+'-'+'28' end

/*

-----------------------
2011-04-26 00:00:00.000

(1 行受影响)


----------
2011-05-31

(1 行受影响)


----------
2011-04-28

(1 行受影响)
快溜 2011-04-19
  • 打赏
  • 举报
回复
declare @date datetime
set @date='2011-4-19'
--第一个星期二
select dateadd(day,10-DATEPART(WEEKDAY,@date),@date)
--第一个31号
select Case when MONTH(@date) IN(1,3,5,7,8,10,13) then CONVERT(varchar(7),@date,120)+'-'+'31'
else CONVERT(varchar(7),dateadd(month,1,@date),120)+'-'+'31' end
/*
----------
2011-05-31
oO寒枫Oo 2011-04-19
  • 打赏
  • 举报
回复

declare @dt datetime
set @dt = '2011-04-19'

SELECT @dt星期几 WHEN 星期 then 本周2
else 下周2 end


select day(@dt) when 31 then 下月31号
else 本月31号 end

select day(@dt) when 大于1 and 小于28 then 本月28号
else 下月28号 end
--小F-- 2011-04-19
  • 打赏
  • 举报
回复
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))
duoxu1983 2011-04-19
  • 打赏
  • 举报
回复

set datefirst 1
select convert(varchar(10),dateadd(day,9-datepart(weekday,'2011-04-18'),'2011-04-18'),110)
Mr_Nice 2011-04-19
  • 打赏
  • 举报
回复
declare @i date
set @i = '2011-04-19'
--1
SELECT DATEADD(dd,CASE (DATEPART(dw,@i) - 1) WHEN 2 THEN 7 WHEN 1 THEN 8 WHEN 3 THEN 6 WHEN 4 THEN 5
WHEN 5 THEN 4 WHEN 6 THEN 3 WHEN 7 THEN 2 END ,@i)
--2011-04-26

;WITH TT
AS(
SELECT DATEADD(dd,number,@i) AS dd
FROM master..spt_values
WHERE type = 'P')

--2
SELECT TOP 1 dd FROM TT WHERE DAY(dd) = 31 AND dd >@i ORDER BY dd ASC
--2011-05-31

--3
SELECT TOP 1 dd FROM TT WHERE DAY(dd) = 28 AND dd >@i ORDER BY dd ASC
--2011-04-28
加载更多回复(3)

34,838

社区成员

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

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