2010-01-14 22 views
3

如果我有一个起始日期列和结束日期列的表,我可以产生返回一组,包括每天范围内的查询。我可以使用表变量并执行一些程序代码,但我想知道是否有方法在查询中执行此操作。之间有两个栏选择日期值

E.g.起始日期= 1/1/2010,结束日期= 2010年1月5日,结果将是:

  • 1/1/2010
  • 1/2/2010
  • 2010年1月3日
  • 1/4/2010
  • 2010年1月5日

...在具有起始日期和结束日期列的表的每一行。

*我在SQL 2005

回答

0
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) 
+2

这不是他问。他希望列出开始日期和结束日期之间的所有日历日期,而不是他的表格中的日期。 –

+0

我看到了。更正 - 谢谢! –

2

的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

使用递归CTE生成序列:** EVIL **。但是你没有列出'spt_values'的方法,所以我会告诉你。 – Aaronaught

+0

@Aaronaught:递归CTE比使用NUMBERS表格技巧更有效率。不知道SPT_VALUES –

+0

@Aaronaught:为什么它是邪恶的 - 尾端递归只是一个循环。 – Hogan

相关问题