2013-03-22 144 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 
相關問題