2015-11-18 4 views
0

В SQL Server 2008 у меня есть начальная дата и дата окончания, переданная моей процедуре. Мне нужно проверить каждую дату в диапазоне, чтобы узнать, существует ли она в моей таблице действительных рабочих дней. Я понятия не имею, где начать на этом, но это, как начало/конец день установлены вверхПроверить каждую дату В диапазоне дат

Declare @startdate date, @enddate date 
Set @startdate = '01/01/2015' 
Set @enddate = '04/16/2015' 

Теперь, как я могу перебирать каждую дату, в этом промежутке, чтобы увидеть, если validworkday = истина для него? Проверку я должен был бы работать, как это (проверка каждого даты)

Select isvalidworkday 
from validworkdays 
where date = '01/01/2015' 
Select isvalidworkday 
from validworkdays 
where date = '01/02/2015' 

ответ

0

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

DECLARE @DateFrom smalldatetime, @DateTo smalldatetime, @firstdate date; 
SET @DateFrom='20000101'; 
SET @DateTo='20081231'; 
------------------------------- 
WITH T(date) 
AS 
( 
    SELECT @DateFrom 
    UNION ALL 
    SELECT DateAdd(day,1,T.date) 
    FROM T 
    WHERE T.date < @DateTo 
) 
SELECT date 
INTO #AllDates 
FROM T OPTION (MAXRECURSION 32767); 

Declare c1 Cursor For 

Select date 
FROM #AllDates 

Open c1 

Fetch Next From c1 Into @firstdate 

While @@FETCH_STATUS = 0 
Begin 
     --Do whatever processing you need here 
     Fetch Next From c1 Into @firstdate 

End 

Close c1 
Deallocate c1 
0

Код должен жить только в одном месте и не переписываться. Создание функций (один раз), как GetAllIntsBetween(), GetAllMonths(), GetAllDates() и т.д. Тогда использовали их люблю:

DECLARE @startdate date = '01/01/2015', @enddate date = '04/16/2015' 

SELECT allDates.TheDate, 
isnull(v.isvalidworkday, false) AS isvalidworkday 
FROM dbo.GetAllDates(@startdate, @enddate) AS allDates 
LEFT JOIN validworkdays AS v 
ON allDates.TheDate = v.MyDate 

The GetAllDates() будет:

CREATE FUNCTION dbo.GetAllDates(@Start DATETIME, @End DATETIME) 
RETURNS 
@AllDates TABLE 
(
TheDate DATETIME 
) 
AS 
BEGIN 

    IF @Start > @End 
    BEGIN 
     DECLARE @Temp DATETIME 
     SET @Temp = @Start 
     SET @Start = @End 
     SET @End = @Temp 
    END 

    WHILE @Start <= @End 
    BEGIN 
     INSERT INTO @AllDates 
     VALUES(@Start) 

     SET @Start = DATEADD(DAY, 1, @Start) 

    END 

RETURN 

END 

(примечание: может изменить DATETIME на DATE)

Смежные вопросы