2013-03-22 140 views
4

有没有一种方法可以使用tsql语法找出每个月的第二个星期二的日期? 例如三月份是十二号,四月份是九号。获取一个月的每个第二个星期二的日期

THX &干杯 亚历

+1

你有什么作为输入,或者你想要的输出是什么?你是否给我们一个'datetime'值,我们必须从同一个月中找到相关的日期?或者你想要一个包含所有这些日期的表格吗? – 2013-03-22 07:40:52

+0

输出应该是** 2013-03-12 **,我想循环一年中的任何月份 - 它对于报告是动态的。 – DaFunkyAlex 2013-03-22 07:43:00

+1

我已更新我的答案,以查找当月的第二个星期二。但请注意,我们通常不会尝试在SQL中编写* loops * - 我们试图找到一个*基于集合的方法 - 告诉SQL Server最终结果集的形状并让* it *计算出如何计算它) – 2013-03-22 07:53:53

回答

2

的一部分,这是你可以找到所有“第二星期二”于2013年

select 
dateadd(day, 8, datediff(day, 1, dateadd(month, n, '2013-01-07'))/7 * 7) date 
from 
(values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) t(n) 
2

不知道什么实际所需的输入和输出,我能给你此刻是用于识别日期为每月的第二个星期二谓词:

DATEPART(day,@Date) between 8 and 14 and --Find the second one in the month 
DATEPART(weekday,@Date) = DATEPART(weekday,'20130319') --Make sure its a Tuesday 

(我用的是固定的,已知周二以避免必须知道什么DATEFIRST设置有效运行查询时)


此找到合适的星期二当月,但显然@Date可以设置为任何利益日期:

declare @Date datetime 
set @Date = CURRENT_TIMESTAMP 

;with Numbers as (select n from (values (0),(1),(2),(3),(4),(5),(6)) t(n)), 
PotentialDates as (select DATEADD(day,n,DATEADD(month,DATEDIFF(month,'20010101',@Date),'20010108')) as Date 
from Numbers 
) 
select * from PotentialDates where DATEPART(weekday,Date) = DATEPART(weekday,'20130319') 

(并希望也很明显,查询可能是一个较大查询的一部分,其中@Date是不是列的值,所以这可以形成基于集合的方式来工作的整片)

+0

谢谢达米恩,这有帮助! – DaFunkyAlex 2013-03-22 07:48:09

1

这段代码会给你每个第一个和第三个星期日的月..所以与SQL的欢呼:-)

declare @dt datetime 
select @dt = '12/01/2014' 

select dateadd(mm,datediff(mm,'',@dt),'') - datepart(dw,dateadd(mm,datediff(mm,'',@dt),'')+0)+ 8 
select dateadd(mm,datediff(mm,'',@dt),'') - datepart(dw,dateadd(mm,datediff(mm,'',@dt),'')+0)+ 22 
相关问题