2016-08-20 756 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 
相关问题