2014-11-28 1 views
1

Что я собираюсь спросить, у меня были трудности с тем, что я искал на всех форумах, здесь любая помощь вообще будет будем очень благодарны! :)Выбор даты SQL Server в наборе записей на основе начальной даты и количества дней в другом наборе записей

Чтобы объяснить, что я хочу, вот небольшой отрывок из представления множества результатов, что я работаю с:

CalendarDate:    WorkDay: 

2014-10-03 00:00:00.000  1  
2014-10-02 00:00:00.000  1 
2014-10-01 00:00:00.000  1 
2014-09-30 00:00:00.000  1 
2014-09-29 00:00:00.000  1 
2014-09-26 00:00:00.000  1 
2014-09-25 00:00:00.000  1 

Этот вид представляет собой таблицу в нашей базе данных, которая отслеживает фактическое рабочие дни для нашей компании; это мнение исключает любые нерабочие дни (отсюда все «1»).

То, что я пытаюсь сделать, - это получить значение времени от другого результирующего набора, найти его в этом наборе результатов и подсчитать количество дней (в зависимости от значения, которое вводится из другого результирующего набора как Что ж). Итак, если я начинал с 3 октября 2014 года, и число дней, в которые я возвращался, составляло 5, я хочу вступить в силу 26 сентября 2014 года.

Лично я вижу, что это выполняется в уникальном количестве записей на предварительно отсортированном виде, но SQL - это разнообразная вселенная способов сделать то же самое, и я хотел бы достичь этого самым эффективным способом :).

Как я уже сказал в начале, я не знал, что этот вопрос должен быть правильно сформулирован, поэтому, если это дубликат, я приношу свои извинения.

ответ

2

вы можете использовать row_number аналитической функции, а затем получить разницу в дни

Предполагая, что ваш второй набор результатов, как это

create table Table2 
(StartDate datetime, 
    days int 
); 

insert into Table2 values ('2014-10-03', 5); 
insert into Table2 values ('2014-10-02', 5); 

Вы можете присоединиться к текущей таблице с этим результирующим набором и получить требуемые out с использованием cte и row_number и самостоятельного присоединения.

with cte 
as 
(
select CalendarDate, row_number() over (order by CalendarDate desc) as rn, WorkDay 
from Table1 
) 
select T1.StartDate, T1.days, T2.CalendarDate as OutDate from 
cte 
join Table2 T1 
on cte.calendarDate = T1.StartDate 
join cte T2 
on T2.rn - cte.rn = T1.days 

результат выйдет как

STARTDATE   DAYS OUTDATE 
October, 03 2014 5 September, 26 2014 
October, 02 2014 5 September, 25 2014 

SQL FIDDLE

+0

Спасибо за ответ радаре! Это именно то, что я искал! : D. – JCBWS

2

И когда вы используете TOP придаточного:

SELECT TOP 1 CalendarDate 
FROM (SELECT TOP 5 CalendarDate 
     FROM DateTable 
     WHERE CalendarDate <'2014-10-03' 
     ORDER BY CalendarDate DESC 
    ) AS T5 
ORDER BY CalendarDate ASC 
+0

Спасибо за ваш вклад тоже CPMunich! – JCBWS