2009-09-29 95 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) 
相關問題