2010-11-18 3 views
0

У меня есть таблица, содержащая один столбец даты сказать, особая дата (хранятся в ггггммдде)Sql запрос создать диапазон дат с одной датой колонком

Как создать диапазон дат среди небольшого подмножества строк?

Пример таблица содержит столбец даты с помощью следующих значений 01-января-2010, 01-февраля-2010, 01-Mar-2010

мне нужно

01-jan-2010 - 01-feb-2010 
01-feb-2010 - 01-mar-2010 

.... .. ..

Пожалуйста, помогите.

+0

Я не уверен, что слежу за тем, что вы хотите. Вы говорите, что у вас три даты в таблице примеров, и вам нужен оператор select, который возвращает четыре, а «20100201» повторяется один раз? –

+0

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

ответ

2

Вы можете попробовать что-то вроде

DECLARE @Table TABLE(
     DateVal DATETIME 
) 

INSERT INTO @Table SELECT '01 Jan 2010' 
INSERT INTO @Table SELECT '01 Feb 2010' 
INSERT INTO @Table SELECT '01 Mar 2010' 

;WITH DateVals AS (
    SELECT *, 
      ROW_NUMBER() OVER(ORDER BY DateVal) RowID 
    FROM @Table 
) 
SELECT s.DateVal StartDate, 
     e.DateVal EndDate 
FROM DateVals s INNER JOIN 
     DateVals e ON s.RowID + 1 = e.RowID 

Выход

StartDate     EndDate 
2010-01-01 00:00:00.000 2010-02-01 00:00:00.000 
2010-02-01 00:00:00.000 2010-03-01 00:00:00.000 

Вы можете избежать КТР с помощью

SELECT s.DateVal StartDate, 
     MIN(e.DateVal) EndDate 
FROM @Table s LEFT JOIN 
     @Table e ON s.DateVal < e.DateVal 
GROUP BY s.DateVal 
HAVING MIN(e.DateVal) IS NOT NULL 

Но я не понимаю, почему вы хотите сделать это.

+0

Есть ли способ, которым я могу избежать CTE? – SumSang

+0

CTE не плохие? Может быть, извините за новичок – SumSang

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