2016-08-20 372 views
0

是否有可能獲得GETDATE()作爲輸入的一個月的第一週的日期。SQL Server:獲取一個月的第一週和第二週的日期範圍

我可以通過下面的代碼獲得當前一週的日期: -

select 
    convert(varchar(50), dateadd(dd, - datepart(dw, GETDATE()) + 1, GETDATE()), 101), 
    convert(varchar(50), dateadd(dd, - datepart(dw, GETDATE()) + 7, GETDATE()), 101) 

我怎樣才能獲得基於GETDATE()作爲輸入當月的第一,第二週的日期?

例如:七月

  • 1周工作日期,2016年 - 2016年1月7日 - 16年2月7日
  • 2周工作日期: - 2016年4月7日 - 9 /二千○十六分之七

感謝

編輯: - 我使用下面的查詢來獲取開始,每星期的結束日期爲給定月份: -

DECLARE @date date = '2016-07-08'--sample date 
DECLARE @firstDay date = DATEADD(M, DATEDIFF(M, 0, @date), 0) 
DECLARE @firstWeekLastDay date = DATEADD(D, 7-DATEPART(DW, @firstDay), @firstDay) 
DECLARE @secondWeekFirstDay date = DATEADD(D, 2, @firstWeekLastDay) 
DECLARE @secondWeekLastDay date = DATEADD(D, 5, @secondWeekFirstDay) 
DECLARE @thirdWeekfirstDay date = DATEADD(D, 2, @secondWeekLastDay) 
DECLARE @thirdWeekLastDay date = DATEADD(D, 5, @thirdWeekfirstDay) 
DECLARE @fourthWeekFirstDay date = DATEADD(D, 2, @thirdWeekLastDay) 
DECLARE @fourthWeekLastDay date = DATEADD(D, 5, @fourthWeekFirstDay) 
DECLARE @fifthWeekFirstDay date = DATEADD(D, 2, @fourthWeekLastDay) 
DECLARE @fifthWeekLastDay date = DATEADD(D, 5, @fifthWeekFirstDay) 

SELECT @firstDay, @firstWeekLastDay, @secondWeekFirstDay, @secondWeekLastDay, @thirdWeekfirstDay, @thirdWeekLastDay, @fourthWeekFirstDay, @fourthWeekLastDay 
+0

那麼這周從週日開始,到週六結束呢? – Whencesoever

+0

也在示例2周只有6天? – Whencesoever

+0

是的,所以基本上可以得到在特定月份的第一週所有的日期。 – Villie

回答

1

您可以使用下面的查詢獲取範圍:

DECLARE @date date = '2016-07-08'--sample date 
DECLARE @firstDay date = DATEADD(M, DATEDIFF(M, 0, @date), 0) 

SELECT CASE DATEPART(DW, @firstDay) 
     WHEN 1 THEN DATEADD(D, 1, @firstDay) 
     ELSE @firstDay END D1, 
     DATEADD(D, 7-DATEPART(DW, @firstDay), @firstDay) D2 

您還可以計算每個月的第一個星期日:

DECLARE @date date = '2016-08-01' 
DECLARE @firstDayOfMonth date = DATEADD(M, DATEDIFF(M, 0, @date), 0) 
DECLARE @firstSundayOfMonth date = DATEADD(D, (DATEDIFF(D, '2016-08-07', @firstDayOfMonth))/7*7, '2016-08-07') 

第一週是從1sunday-1,第二 - 從sunday+1sunday+6

+0

謝謝!我已經更改了查詢(檢查編輯部分)以獲取特定月份的每個開始日期和結束日期。 – Villie

0

根據GETDATE(),這會給你所有月份的第一個和第二個星期的日期,除了星期日。如果您想測試特定日期,只需更改@date變量的值。

DECLARE @dt1 Datetime, @dt2 Datetime 
DECLARE @date Datetime = GETDATE() 

SELECT @dt1 = DATEADD(MM, DATEDIFF(MM, 0, @date), 0) 
SELECT @dt2 = DATEADD(DD,14 , @dt1) 

;WITH daterange 
AS 
(
    SELECT [dates][email protected] , 
      DATEPART(WEEKDAY, @dt1) WD, --Weekday 
      DATEPART(DD,@dt1) [DAY], -- Day 
      1 WN -- Week no. 
    UNION ALL 
    SELECT [dates] + 1 , 
     DATEPART(WEEKDAY, [dates] + 1) WD, --Weekday 
     DATEPART(DD,[dates] + 1) [DAY], --Day 
     CASE WHEN DATEPART(WEEKDAY, [dates] + 1) = 1 AND [DAY]<>1 THEN WN + 1 ELSE WN END WN --Week no. 
    FROM daterange 
    WHERE [dates] + 1<= @dt2 
) 
SELECT [dates] 
FROM daterange C 
WHERE WN <= 2 AND WD <> 1 
相關問題