2015-01-20 6 views
0
году

У меня есть таблица, которая содержит ДатуДоступные диапазона дат по

ID  Dates 
1  2014-01-20 
2  2014-01-21 
... 
100  2014-05-20 
101  2014-06-01 --Missing a few dates 
102  2014-06-02 
... 
201  2014-10-31 
202  2014-12-05 --Missing a few dates 
... 
349  2015-04-29 
350  2015-04-30 

Я хочу найти доступный диапазон дат на год между а от и до настоящего времени, например

@StartDate: 2014/04/06 
@EndDate: 2015/04/05 

Ожидаемого

Year StartRange  EndRange 
2014 2014-04-06  2014-05-20 
2014 2014-06-01  2014-10-31 
2014 2014-12-05  2014-12-31 
2015 2015-01-01  2015-04-05 

Я пытаюсь найти доступные диапазоны дат от столбца Даты. Давайте возьмем первую строку ожидаемого результата 2014-04-06 - 2014-05-20, в котором говорится, что у меня есть непрерывные даты с 6 апреля по 20 мая, тогда есть перерыв (у меня нет дат 2014-05 -21 до 2014-05-30)

даты 2014-04-06 (в первой строке) и 2015-04-05 (в последней строке), включены в ожидаемый результат, как это это даты начала и окончания (параметр в запросе) и у меня есть эти даты в колонке [дата] моего стола

Благодарности

+1

Это неопределенный вопрос. Я не могу понять, как вы получаете от своего ввода ожидаемый результат ... –

+0

Я не понимаю ваш ожидаемый результат. Ваши входы - это дата начала и окончания, а таблица содержит одну дату. Я не понимаю, что представляют собой столбцы StartRange и EndRange. – bratsche

+0

Я пытаюсь найти доступные диапазоны дат из столбца Даты. Давайте возьмем первую строку ожидаемого результата 2014-04-06 до 2014-05-20, в которой говорится, что у меня есть непрерывные даты с 6 апреля по 20 мая, тогда есть перерыв (у меня нет дат 2014-05-21 до 2014-05-30) – Swamy

ответ

0

Это «есть земли и пробелы ". Вот один из способов сделать это:

; 
WITH 
    cteDays As (SELECT *, DATEDIFF(dd,0,Dates) As DayNo From YourTable) 
, cteDifs As 
(
    SELECT *, 
     DayNo-(ROW_NUMBER() OVER(ORDER BY Dates, ID)) As Dif 
    FROM cteDays 
) 
SELECT 
    Year(Dates) As [Year], 
    MIN(Dates) As StartRange, 
    MAX(Dates) As EndRange 
FROM cteDifs 
GROUP BY Year(Dates), Dif 
ORDER BY [Year], StartRange 
Смежные вопросы