SQL Server: получение диапазонов дат первой и второй недели месяца

sql-server

737 просмотра

2 ответа

Можно ли получить даты первой недели месяца, когда в качестве входных данных указана GETDATE ().

Я могу получить даты текущей недели по следующему коду: -

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 года: - 07.01.2016 - 07.02.16
  • 2 недели рабочих дней: - 4/7/2016 - 9/7/2016

Спасибо

РЕДАКТИРОВАТЬ: - Я использую запрос ниже, чтобы получить дату начала и окончания каждой недели для данного месяца: -

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
Автор: Villie Источник Размещён: 08.11.2019 11:32

Ответы (2)


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.

Автор: Paweł Dyl Размещён: 20.08.2016 08:17

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]=@dt1 ,
          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
Автор: Sagar Shelke Размещён: 20.08.2016 11:54
Вопросы из категории :
32x32