Выберите даты между двумя значениями столбцов - PullRequest
3 голосов
/ 14 января 2010

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

например. StartDate = 01.01.2010, EndDate = 05.01.2010, результат будет:

  • 1/1/2010
  • 1/2/2010
  • 1/3/2010
  • 1 / 4/2010
  • 1/5/2010

... для каждой строки таблицы, содержащей столбцы StartDate и EndDate.

* Я на SQL 2005

Ответы [ 2 ]

2 голосов
/ 14 января 2010

SQL Server 2005 +:

WITH dates AS (
   SELECT t.startdate 'date'
     FROM TABLE t
    WHERE t.startdate = '1/1/2010'
   UNION ALL
   SELECT DATEADD(dd, 1, t.date) 
     FROM dates t
    WHERE DATEADD(dd, 1, t.date) <= (SELECT t.enddate FROM TABLE t WHERE t.enddate = '1/5/2010'))
SELECT ...
  FROM TABLE t
  JOIN dates d ON d.date = t.date

Если ваши даты не более 2047 дней:

SELECT DATEADD(day, 
               n.number, 
               (SELECT t.startdate FROM TABLE t WHERE t.startdate = '1/1/2010')
               )
  FROM (SELECT DISTINCT number 
          FROM MASTER.dbo.SPT_VALUES
         WHERE name IS NULL) n
 WHERE DATEADD(day, n.number, (SELECT t.startdate FROM TABLE t WHERE t.startdate = '1/1/2010')) <= (SELECT t.endate FROM TABLE t WHERE t.endate = '1/5/2010')
0 голосов
/ 14 января 2010
with DateList as 
( 
      select cast('1/1/2010' as datetime) DateValue 
      union all 
      select DateValue + 1 
      from    DateList     
      where   DateValue + 1 >= '1/1/2010' AND DateValue +1 <= '1/5/2010' 
) 
select CONVERT(varchar, DateValue, 101) 
from    DateList 

OPTION (MAXRECURSION 0) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...