SQL Server.Хранимая процедура для получения раз в две недели - PullRequest
0 голосов
/ 31 декабря 2010

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

Бизнес-логика: первый понедельник года - первый деньраз в две недели.

Например, в 2010 году:

    period  period_start  period_end
    1       2010-01-04    2010-01-17
    2       2010-01-18    2010-01-31
    3       2010-02-01    2010-02-14
    ....
    26      2010-12-20    2011-01-02

Проходя сегодняшнюю дату 2010-12-31, вернется 26, 2010-12-20 и 2011-01-02.Как этого добиться?

Ответы [ 2 ]

2 голосов
/ 31 декабря 2010

@ Ламак выполнил сложную часть, выяснив первый понедельник в году (голосование поднято).Я немного изменил его подпрограмму, чтобы получить значение даты и времени, например:

--  Return first Monday for the year being passed in
CREATE FUNCTION dbo.FirstMonday (@TargetDay datetime)
RETURNS DATE
AS
BEGIN
DECLARE @Return DATE

--  Set to first of its year
SET @TargetDay = dateadd(dd, -datepart(dayofyear, @TargetDay) + 1, @TargetDay)

;WITH Dates AS
(
  SELECT @TargetDay AS DateVal
  UNION ALL
  SELECT DATEADD(d, 1, DateVal) AS DateVal
  FROM Dates
  WHERE DATEADD(d, 1, DateVal) < DATEADD(m, 1, @TargetDay)
)
SELECT @Return = MIN(DateVal)
FROM Dates
WHERE DATENAME(WEEKDAY,DateVal) = 'Monday'

RETURN @Return
END 
GO

--  Test it
print dbo.FirstMonday(getdate())
print dbo.FirstMonday('Jan 1, 2010')

Оттуда это просто некоторая арифметика даты и времени:

DECLARE
  @FirstMonday  datetime
 ,@TargetDay    datetime
 ,@BiWeek       int

SET @TargetDay = getdate()
--SET @TargetDay = 'Jan 17, 2010'

--  Get the first Monday
SET @FirstMonday = dbo.FirstMonday(@TargetDay)

--  Calculate the bi-weekly period
SET @BiWeek = datediff(dd, @FirstMonday, @TargetDay) / 14

--  Print results
PRINT @BiWeek + 1
PRINT dateadd(dd, @BiWeek * 14, @FirstMonday)
PRINT dateadd(dd, @BiWeek * 14 + 13, @FirstMonday)

--  Or return them as a dataset
SELECT
  @BiWeek + 1                                   Period
 ,dateadd(dd, @BiWeek * 14, @FirstMonday)       PeriodStart
 ,dateadd(dd, @BiWeek * 14 + 13, @FirstMonday)  PeriodEnd

Это не работает, когда вы выбираете деньгод, который выпадает до первого понедельника, так как он возвращает первый двухнедельный период после этой даты.(Или это не получается? Вы не указали, какой период подходит для таких дат ...:)

Однако, как говорит @HLGEM, в зависимости от того, что вы делаете, вам, вероятно, лучше строить и использоватьнекоторая форма таблицы поиска раз в две недели, особенно если вам нужна правильная обработка этих ранних дат.

1 голос
/ 31 декабря 2010

Вы можете создать функцию для получения первого понедельника года. Примерно так должно работать:

CREATE FUNCTION dbo.FirstMonday(@Year VARCHAR(4))
RETURNS DATE
AS
BEGIN
DECLARE @Return DATE;

WITH Dates AS  
(
  SELECT CONVERT(DATE,@Year+'0101') AS DateVal 
  UNION ALL 
  SELECT DATEADD(d, 1, DateVal) AS DateVal 
  FROM Dates 
  WHERE DATEADD(d, 1, DateVal) < DATEADD(m, 1, @Year+'0101')
)
SELECT @Return = MIN(DateVal)
FROM Dates
WHERE DATENAME(WEEKDAY,DateVal) = 'Monday'

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