2014-09-30 4 views
0

У меня есть таблица календаря, в которой хранятся строки дат и указание того, что эта дата является праздником или рабочим днем.TSQL Calendar table, count 10 рабочих дней с даты

Как я могу выбрать дату, которая составляет 5 рабочих дней в будущее с 2014-12-22 поэтому выбранная дата будет 2014-12-31

Date_Id  Date_Date Date_JDE Is_WorkingDay 
20141222 2014-12-22 114356  1 
20141223 2014-12-23 114357  1 
20141224 2014-12-24 114358  1 
20141225 2014-12-25 114359  0 
20141226 2014-12-26 114360  0 
20141227 2014-12-27 114361  0 
20141228 2014-12-28 114362  0 
20141229 2014-12-29 114363  1 
20141230 2014-12-30 114364  1 
20141231 2014-12-31 114365  1 
+0

Я ответил с ** 5 ** рабочих дней так как это t он имеет значение вопроса, но у вас есть ** 10 ** в названии. – christiandev

ответ

2

Вы можете использовать CTE как это ...

;WITH cteWorkingDays AS 
(
SELECT Date_Date, ROW_NUMBER() OVER (ORDER BY Date_Date) as 'rowNum' 
FROM TableName 
WHERE Is_WorkingDay = 1 
and Date_Date > '20141222' -- this will be a param I suppose 
) 

SELECT Date_Date 
FROM cteWorkingDays 
WHERE rowNum = 5 -- this can be changed to 10 (title value 

Это ручной ввод, но он будет достаточно близко.

EDIT: на основе комментария.

Declare @DateToUse TYPE -- unsure if you're using a string or a date type. 
SELECT @DateToUse = Date_Date 
    FROM cteWorkingDays 
    WHERE rowNum = 5 
+0

Спасибо за ответ, очень полезно. Но как я могу выбрать значение из 'cteWorkingDays' в переменную? – user667430

+0

Я только что добавил обновление, дайте мне знать, если это не имеет смысла. – christiandev

+1

О, я вижу, я пытался использовать 'SET' для установки переменной вместо' SELECT'. Спасибо. – user667430

1
...; 

WITH DatesCTE AS 
(
    SELECT Date_Id, 
      Date_Date, 
      Date_JDE, 
      Is_WorkingDay, 
      ROW_NUMBER() OVER(ORDER BY Date_Date) AS rn 
    FROM DatesTable 
    WHERE Is_WorkingDay = 1 
      AND Date_Date > '2014-12-22' 
) 
SELECT Date_Date 
FROM DatesCTE 
WHERE rn = 5 

SQL Fiddle Demo

0

Вы можете попробовать, как это:

with calender as 
(select top 5 date_id,date_date,date_jde from calender 
where date_date>='2014-12-22' and is_workingday='1)calender 
select top 1 * from calender order by date_date desc 
+0

Какой порядок для топ-5? и вы не хотите включать 22-й? '=>' – christiandev

+0

Не могли бы вы просмотреть и опубликовать скрипт sql для проверки этой концепции? – Aditya

0

с производными таблицами

select * from 
(
SELECT Date_Date, ROW_NUMBER() OVER (ORDER BY Date_Date) as 'RowNum' 
FROM Table_calendar 
WHERE Is_WorkingDay = 1 
and CAST(Date_Date as DATE) > '2014-12-22' 
)d 
where d.RowNum=5 
Смежные вопросы