2008-09-18 26 views
10

我只想要一個快速的方法(最好不使用while循環)創建日期@x和日期@y之間的每個日期的表,所以我可以將外部聯接留給某些統計表,其中一些統計表在其間的某些統計表中沒有記錄,從而允許我用缺少的記錄標記0如何獲取在x和y之間的日期表在sql服務器2005

回答

18

嚴格來說,這並不完全回答你的問題,但它的整潔。

假設你可以指定天數的開始日期後,再使用公共表表達式生活給你:

WITH numbers (n) AS (
     SELECT 1 UNION ALL 
     SELECT 1 + n FROM numbers WHERE n < 500) 
    SELECT DATEADD(day,n-1,'2008/11/01') FROM numbers 
    OPTION (MAXRECURSION 500) 
+0

你是一個天才!幹得好,沒有想到使用CTE! – digiguru 2008-09-18 19:26:09

-4

Just:WHERE col> start-date AND col < end date date

+0

他試圖創建一個表來做左外連接。這不會做他想做的事。 – 2008-09-18 18:25:08

3

我相信你正在尋找this blog post

+0

它很髒,但它做的工作 – digiguru 2008-09-18 18:26:47

+0

它可以移植到其他SQL引擎(包括Server 2000)。 :) – IDisposable 2009-10-19 19:54:24

0

我認爲你不妨在while循環中做。我知道這很醜陋,但很簡單,它很有效。

0

我實際上正在做一些類似的事情,但我不能想出一種不使用循環的方式。

我得到的最好的是一張臨時表,然後選擇我想要加入的日期。

博客bduke鏈接到可愛,雖然我認爲臨時表解決方案可能是一個更乾淨的解決方案。

0

我發現,(它的網站訪問者),那麼這個怎麼樣保存每次約會另一個表...

Declare @FromDate datetime, 
     @ToDate datetime 
Declare @tmpDates table 
      (StatsDate datetime) 
Set @FromDate = DateAdd(day,-30,GetDate()) 
Set @ToDate = GetDate() 

Insert Into @tmpDates (StatsDate) 
Select 
    distinct CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME) 
FROM tbl_visitorstats 
Where visitDate between @FromDate And @ToDate 
Order By CAST(FLOOR(CAST(visitDate AS DECIMAL(12, 5))) AS DATETIME) 


Select * FROM @tmpDates 

它不依賴於具有每次約會我的條目其他表想要,但98%可能會有每天的數據。

-1

只要寫循環。有人必須爲此編寫一個循環,無論是你還是SQL Server。

DECLARE @Dates TABLE 
(
    TheDate datetime PRIMARY KEY 
) 
DECLARE @StartDate datetime, @EndDate datetime 
SELECT @StartDate = '2000-01-01', @EndDate = '2010-01-01' 


DECLARE @LoopVar int, @LoopEnd int  
SELECT @LoopEnd = DateDiff(dd, @StartDate, @EndDate), @LoopVar = 0 


WHILE @LoopVar <= @LoopEnd 
BEGIN 
    INSERT INTO @Dates (TheDate) 
    SELECT DateAdd(dd,@LoopVar,@StartDate) 

    SET @LoopVar = @LoopVar + 1 
END 


SELECT * 
FROM @Dates 
1

我會創建一個日曆表,它只包含從合適的開始日期到合適的結束日期的每個日期。這不會佔用您數據庫中的太多空間,並且會使這些類型的查詢變成遊戲。

select ... 
from Calendar 
     left outer join 
     ... 
where Calendar.Date >= @x 
and  Calendar.Date <= @y 
0

作爲https://stackoverflow.com/a/95728/395440給出的答案略有扭曲。允許指定日期並計算到當前日期的範圍。

DECLARE @startDate datetime 
SET @startDate = '2015/5/29'; 

WITH number (n) AS (
     SELECT 1 UNION ALL 
     SELECT 1 + n FROM dates WHERE n < DATEDIFF(Day, @startDate, GETDATE())) 
    SELECT DATEADD(day,n-1,@startDate) FROM number where 
    datename(dw, DATEADD(day,n-1,@startDate)) in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday') 
    OPTION (MAXRECURSION 500) 
相關問題