Получение даты начала и окончания недели? В Sql server?

в sql, как получить дату начала и окончания недели для конкретного месяца. Вы можете мне помочь?

5 ответов


следующий будет работать, что вы считаете первый день недели (воскресенье, понедельник и т. д.), Просто убедитесь, что вы используете SET DATEFIRST Если вы хотите изменить по умолчанию. SET DATEFIRST 1 первый день недели понедельник.

SELECT  DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekStart],
        DATEADD(DAY, 7 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekEnd]

редактировать

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

SELECT  DATENAME(WEEKDAY, DATEADD(DAY, 1 - DATEPART(DAY, GETDATE()), GETDATE())) [FirstDayOfMonth],
        DATENAME(WEEKDAY, DATEADD(DAY, - DATEPART(DAY, DATEADD(MONTH, 1, GETDATE())), DATEADD(MONTH, 1, GETDATE()))) [LastDayOfMonth]

чтобы получить первый день недели:

select dateadd(wk, datediff(wk, 0, getdate()), 0)

последний день будет первый день + 6:

select dateadd(wk, datediff(wk, 0, getdate()), 0) + 6

предупреждение: это чувствительно к культуре. Проверьте документацию на @@параметр datefirst


ваше требование неясно: что вы считаете первым и последним днями недели? Воскресенье и суббота? Понедельник и пятница? Понедельник и воскресенье? Но лучшим решением для многих запросов, связанных с датой, является создание календарь. Это дает вам возможность легко установить первые и последние дни недель, месяцев и лет в соответствии с вашим определением и даже в нескольких форматах, если это необходимо.

Это особенно полезно, если вы работаете с понятиями, как финансовые годы, рабочие дни и т. д., где определения различаются по странам и даже компаниям. Это также самое простое решение, когда есть исключения из вашей логики, например, первая неделя года имеет другие правила, чем "нормальная" неделя.

с таблицей календаря вы можете предварительно заполнить первые и последние дни недели, а затем ваш запрос может быть примерно таким:

-- first/last days stored as dates in their own columns
select FirstDayOfThisWeek, LastDayOfThisWeek
from dbo.Calendar
where BaseDate = @SomeDate

-- first/last days stored as bit flags
select max(BaseDate)
from dbo.Calendar
where BaseDate <= @SomeDate and IsFirstDayOfWeek = 0x1

Ниже приведен оператор case, который можно использовать для создания Weekbegin для вашего значения даты. Это заставит ваши недели начаться в понедельник или вторник или жениться... так далее. в зависимости от того, какой день недели вы установили как @pDate.

создать параметры

DECLARE @pDate Date = NULL --Replace with your date, which will also be the first day of the week
DECLARE @pDatePart SMALLINT = DATEPART(dw, @pDate)

затем поместите этот оператор case после вашего select

CASE 
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN @pDatePart  AND 7 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)+@pDatePart, CAST(DATEVALUE AS DATE))
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN 1 AND @pDatePart-1 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)+(@pDatePart-7), CAST(DATEVALUE AS DATE))
    END
    AS DynamicWeekBegin

вы всегда можете получить окончательную дату недели, просто используя dateadd (d, 6, оператор CASE)


здесь я дал

неделя, месяц, квартал, половина года, дата начала и конца года.

     Select CONVERT(varchar(50), GETDATE(),105) 'GETDATE' ,
       CONVERT(varchar(50), DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)),105) [WeekStart],
CONVERT(varchar(50),DATEADD(DAY, 8 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) ,105)[WeekEnd],
CONVERT(varchar(50),DATEADD(dd, -DAY(getdate()) + 1, getdate()),105) MonthStart,
CONVERT(varchar(50),DATEADD(dd, -DAY(DATEADD(mm, 1, getdate())), DATEADD(mm, 1, getdate())),105) MonthStart,
CONVERT(varchar(50), DATEADD(q, DATEDIFF(q, 0, GETDATE()), 0),105)  AS 'QStart Date',      
CONVERT(varchar(50), DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) + 1,0)),105) AS 'QEnd Date',
CONVERT(varchar(50), CAST(CAST(((((MONTH(GETDATE()) - 1) / 6) * 6) + 1) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105) StartOfHalfYear,
CONVERT(varchar(50),  CAST(CAST(((((MONTH(GETDATE()) - 1) / 6) * 6) + 6) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105)EndOfHalfYear,
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()), 0),105) AS StartOfYear,
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, -1),105) AS EndOfYear