使用SQL server 2000.如果开始日期为06/23/2008
且结束日期为06/30/2008
然后我需要输出查询为
06/23/2008
06/24/2008
06/25/2008
.
.
.
06/30/2008
我创建了一个表名为Integer的表,其中有1列,列值为0,1,2,3,4,5,6,7,8,9然后我使用了下面提到的查询
尝试查询
SELECT DATEADD(d, H.i * 100 + T .i * 10 + U.i, '" & dtpfrom.Value & "') AS Dates
FROM integers H
CROSS JOIN integers T
CROSS JOIN integers U
order by dates
以上查询仅显示999个日期。 999日期表示(365 + 365 + 269)仅限日期。假设我想选择3年以上(01/01/2003至01/01/2008)。以上查询不适合。
如何修改我的查询?或者任何其他查询可用于上述条件。
请向我提供查询。
答案 0 :(得分:4)
我不会循环创建日期列表,使用Numbers表(不只是值为0到9的表),它们对许多事情都很有用:http://web.archive.org/web/20150411042510/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html使用真正的Numbers表,你不要不得不多次CROSS JOIN并使查询过于复杂。
要使此方法起作用,您需要执行以下一次性表设置:
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
INTO Numbers
FROM sys.columns s1
CROSS JOIN sys.columns s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)
设置Numbers表后,请使用以下查询:
SELECT
@Start+Number-1
FROM Numbers
WHERE Number<=DATEDIFF(day,@Start,@End)+1
捕获它们:
DECLARE @Start datetime
,@End datetime
DECLARE @AllDates table
(Date datetime)
SELECT @Start = '06/23/2008', @End = '06/30/2008'
INSERT INTO @AllDates
(Date)
SELECT
@Start+Number-1
FROM Numbers
WHERE Number<=DATEDIFF(day,@Start,@End)+1
SELECT * FROM @AllDates
输出:
Date
-----------------------
2008-06-23 00:00:00.000
2008-06-24 00:00:00.000
2008-06-25 00:00:00.000
2008-06-26 00:00:00.000
2008-06-27 00:00:00.000
2008-06-28 00:00:00.000
2008-06-29 00:00:00.000
2008-06-30 00:00:00.000
(8 row(s) affected)
答案 1 :(得分:3)
一种可能的方式(不是说它是最好的或最有效的)将是这样的:
DECLARE @StartDate DATETIME
SET @StartDate = '06/23/2008'
DECLARE @EndDate DATETIME
SET @EndDate = '06/30/2008'
DECLARE @TableOfDates TABLE(DateValue DATETIME)
DECLARE @CurrentDate DATETIME
SET @CurrentDate = @startDate
WHILE @CurrentDate <= @endDate
BEGIN
INSERT INTO @TableOfDates(DateValue) VALUES (@CurrentDate)
SET @CurrentDate = DATEADD(DAY, 1, @CurrentDate)
END
SELECT * FROM @TableOfDates
这适用于任意数量的日期,任何日期范围,并且不需要具有整数值的特定“帮助者”表。
它将所有相关日期存储到内存中的表变量中,以便您可以将其用于例如另一个SELECT语句或任何你需要的语句。
马克
答案 2 :(得分:2)
请参阅:
Why should I consider using an auxiliary calendar table?
日历表可以做得更多 更容易开发任何解决方案 涉及日期的商业模式。 最后我查了一下,这包括了 几乎任何商业模式都可以 想到某种程度。不变 最终需要的问题 冗长,复杂,低效 方法包括以下内容 问题:
- x和y之间有多少个工作日?
- ...
答案 3 :(得分:0)
这将使您达到100,000天:
SELECT DATEADD(d, Y.i * 10000 + X.i * 1000 + H.i * 100 + T .i * 10 + U.i, '" & dtpfrom.Value & "') AS Dates
FROM integers H
CROSS JOIN integers T
CROSS JOIN integers U
CROSS JOIN integers X
CROSS JOIN integers Y
order by dates