2011-12-19 4 views
2

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

например 26 декабря 2011 (понедельник) - 1 января 2012 (воскресенье) ... < < бы хотеть рассмотреть это как последнюю неделю 2011 года

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

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

+0

Как бы вы определили в первую неделю года? – Andomar

+0

Ну, 3 января 2011 года - 9 января 2011 года. Первое понедельник года. – user1106741

+0

Вы можете использовать 'SET DATEFIRST', чтобы указать начальный день недели. – Magnus

ответ

3
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

Я думаю вам нужно вычесть 1 из вашей даты окончания. При дальнейшем рассмотрении я получаю плохие даты при использовании Недели 1. – UnhandledExcepSean

+0

@SpectralGhost Спасибо за исправление, обновлено. –

+0

Недели были основаны на нулевом значении, но я обновился, чтобы быть единым для удобства использования. –

0

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

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

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

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

+0

Если вам нужен праздничный стол, посмотрите этот скрипт: http://www.sqlservercentral.com/scripts/Date+Manipulation/74302/ Отказ от ответственности, я написал его, но он абсолютно бесплатный ... – Sparky

0

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

0

Как об этом один:

--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 @[email protected]+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] 
Смежные вопросы