2009-09-29 144 views
2

使用SQL Server 2000。如果开始日期是06/23/2008和结束日期是06/30/2008如何显示所有给定的两个日期之间的日期在SQL

然后,我需要查询的输出作为

06/23/2008 
06/24/2008 
06/25/2008 
. 
. 
. 
06/30/2008 

我所创建的表的名称作为整数,其具有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

这将让你可达10万日:

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 
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语句或任何你需要它的东西。

马克

+0

这是2005年之前的理想方法,因为您不能使用CTE - 请参阅此问题中的注释以了解详细信息:http://stackoverflow.com/questions/1478951/tsql-generate-a-resultset-of -incrementing-dates/1479028#1479028 – 2009-09-29 06:24:42

+0

这个循环会比使用传统数字表慢得多,如我的答案中所述。如果这是一次性的事情,这可以使用。但是,如果您将生成许多日期范围,请使用更高效的无循环方法。 – 2009-09-29 15:10:08

+0

是的 - 但你不需要额外的数字表!而对于10到20行,我不知道差异会有多大。 – 2009-09-29 15:32:37

2

参见:

Why should I consider using an auxiliary calendar table?

日历表可以使它更容易 开发围绕涉及日期的任何 业务模式的解决方案。 最后我检查了一下,这包括几乎任何商业模式 ,你可以在一定程度上想到 。恒 问题,最终需要 冗长,复杂和低效 方法包括以下 问题:X和Y之间

  • 多少个工作日?
  • ...
+0

这是一个数据仓库技术,如你所说,它非常强大。但它仍然需要填充。 – Hooloovoo 2009-09-29 13:50:29

4

我不会循环创建日期列表,用数字表(不只是一个值为0到9的表格),它们对于很多事情是有用的:http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html使用真正的Numbers表,您不必交叉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) 

一旦表被设置了号码,使用这个查询:

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) 
相关问题