如果我有一个起始日期列和结束日期列的表,我可以产生返回一组,包括每天范围内的查询。我可以使用表变量并执行一些程序代码,但我想知道是否有方法在查询中执行此操作。之间有两个栏选择日期值
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
如果我有一个起始日期列和结束日期列的表,我可以产生返回一组,包括每天范围内的查询。我可以使用表变量并执行一些程序代码,但我想知道是否有方法在查询中执行此操作。之间有两个栏选择日期值
E.g.起始日期= 1/1/2010,结束日期= 2010年1月5日,结果将是:
...在具有起始日期和结束日期列的表的每一行。
*我在SQL 2005
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)
的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')
使用递归CTE生成序列:** EVIL **。但是你没有列出'spt_values'的方法,所以我会告诉你。 – Aaronaught
@Aaronaught:递归CTE比使用NUMBERS表格技巧更有效率。不知道SPT_VALUES –
@Aaronaught:为什么它是邪恶的 - 尾端递归只是一个循环。 – Hogan
这不是他问。他希望列出开始日期和结束日期之间的所有日历日期,而不是他的表格中的日期。 –
我看到了。更正 - 谢谢! –