T-SQL - получить дату начала и окончания на основе номера недели. - PullRequest
2 голосов
/ 20 декабря 2011

Наш бизнес считает неделю с (понедельник - воскресенье).Мне нужно написать функцию T-SQL, которая передает в качестве параметров год, неделю и возвращает дату начала и окончания этой недели.Однако я видел много примеров, но проблема заключается в том, что год перекрывается.

например, 26 декабря 2011 г. (понедельник) - 01 января 2012 г. (воскресенье) ... << Хотелось бы рассмотреть это как последнюю неделю 2011 г. </p>

А также в T-SQL datepart (ww, DATE) считает воскресенье началом недели ??

Или мне лучше создать свою собственную таблицу с номером недели и сохранить ее дату начала и окончания?

Ответы [ 4 ]

3 голосов
/ 20 декабря 2011
DECLARE
    @Year INT,
    @Week INT,
    @FirstDayOfYear DATETIME,
    @FirstMondayOfYear DATETIME,
    @StartDate DATETIME,
    @EndDate DATETIME

SET @Year = 2011
SET @Week = 52

-- Get the first day of the provided year.
SET @FirstDayOfYear = CAST('1/1/' + CAST(@YEAR AS VARCHAR) AS DATETIME)

-- Get the first monday of the year, then add the number of weeks.
SET @FirstMondayOfYear = DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, @FirstDayOfYear), @FirstDayOfYear)), 0)

SET @StartDate = DATEADD(WEEK, @Week - 1, @FirstMondayOfYear)

-- Set the end date to one week past the start date.
SET @EndDate = DATEADD(WEEK, 1, @StartDate)

SELECT @StartDate AS StartDate, DATEADD(SECOND, -1, @EndDate) AS EndDate
0 голосов
/ 20 декабря 2011

Как насчет этого:

--DROP FUNCTION dbo.GetBusinessWeekStart
CREATE FUNCTION dbo.GetBusinessWeekStart(
    @Year SMALLINT,
    @Week TINYINT
)
RETURNS DATETIME
AS
BEGIN
    DECLARE @FirstMonday TINYINT
    DECLARE @Result DATETIME

    IF ISNULL(@Week,0)<1 OR ISNULL(@Year,0)<1900
        BEGIN
            SET @Result= NULL;
        END
    ELSE
        BEGIN
            SET @FirstMonday=1

            WHILE DATEPART(dw,CONVERT(DATETIME, '01/0' + CONVERT(VARCHAR,@FirstMonday) + '/' + CONVERT(VARCHAR,@Year)))<>2
            BEGIN
                SET @FirstMonday=@FirstMonday+1
            END

            SET @Result=CONVERT(DATETIME, '01/0' + CONVERT(VARCHAR,@FirstMonday) + '/' + CONVERT(VARCHAR,@Year))
            SET @Result=DATEADD(d,(@Week-1)*7,@Result)

            IF DATEPART(yyyy,@Result)<>@Year
                BEGIN
                    SET @Result= NULL;
                END
        END

    RETURN @Result
END
GO

--Example
SELECT dbo.GetBusinessWeekStart(2011,15) [Start],dbo.GetBusinessWeekStart(2011,15)+6 [End]
0 голосов
/ 20 декабря 2011

Это тот тип вещей, когда вам лучше создать таблицу календаря: основная проблема заключается в том, чтобы знать, как далеко в прошлое / будущее ее заполнить, но помимо этого, в схеме таблицы должны быть указаны номер недели и дата. В зависимости от того, какие другие запросы на основе дат вы хотите выполнить, вам может понадобиться дополнительный столбец, чтобы разбить дату на составные части (например, иметь три отдельных столбца для дня / месяца / года / названия дня и т. Д.).

0 голосов
/ 20 декабря 2011

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

После этого считайте дни между начальной датой и конечной датой. (Шаг1)

Выберите в своей таблице, чтобы узнать, сколько дней проходит между вашими начальными и конечными датами. (Step2)

Наконец, вычтите результат шага 2 с результатом шага 1;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...