2016-08-20 4 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: - 1/7/2016 - рабочие даты 2/7/16
  • 2 недели: - 4/7/2016 - 9/7/2016

Благодаря

EDIT: - Я использую ниже запроса, чтобы получить дату начала и окончания каждой недели в течение данного месяца: -

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

также в примере 2week имеет только 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') 

Первая неделя будет от 1 до sunday-1, второй - от sunday+1 к sunday+6.

+0

Спасибо! Я изменил запрос (раздел «Проверить редактирование»), чтобы получить каждую дату начала и окончания для определенного месяца. – Villie

0

Это даст вам все даты 1-й и 2-й недели месяца, кроме воскресенья, основанного на 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 
Смежные вопросы