2013-02-01 108 views
-1

似乎是多餘的,但我正在嘗試計算過程中臨時創建的表中的行。過程計算兩個日期之間的日期

(注意:表格最有可能編碼錯誤)需要計算@rows變量並應輸出@StartDate變量在一年中的確切天數。 (這是包括閏年)。

創建的表格也應該在@StartDate變量的整整一年後的每一天的INSERT日期VALUES

TEMPORARY TABLE在此作業中需要。對不起人,但那是老師所要求的。

FYI:我是新手,和幫助將不勝感激:)

CREATE PROCEDURE usp_DateLookup 
    @StartDate DATE, 
    @Rows INT OUTPUT 

AS 
    DECLARE @countIndex INT 
    DECLARE @yearDate DATE 
    DECLARE @todaysDate DATE 
    SET @yearDate = DATEADD(YEAR, 1,@StartDate) 
    SET @todaysDate = GETDATE() 
    BEGIN 

     CREATE TABLE #DateLookup 
     (
     DateID INT IDENTITY (1,1), 
     DateDescription DATE 
     ) 

    WHILE (SELECT DATEDIFF(DD,@StartDate, @yearDate) FROM #DateLookup) <= 366 
    BEGIN 
     SET @countIndex = @countIndex +1 

     INSERT #DateLookup (DateDescription) 
     VALUES (DAY(@todaysDate)+ @countIndex) 

    END 
    SET @Rows = (SELECT COUNT(DateDescription) FROM #DateLookup) 
END 
GO 


DECLARE @StartDate DATE 
DECLARE @Rows INT 

SET @StartDate = '2012-05-06' 
EXEC usp_DateLookup @StartDate, @Rows OUTPUT 
PRINT CONVERT(NVARCHAR,@Rows) 
+0

爲什麼你需要'#DateLookup'表?每次運行此過程時都要創建此表。你必須丟棄它 – Kaf

+1

你的程序充滿了問題,但是你沒有說明你目前的問題是什麼(錯誤?結果不正確?)或你希望你的程序做什麼。您似乎想要計算特定日期和一年後同一天之間的天數,但在這種情況下,您只需要'DATEDIFF()'和'DATEADD()',不需要臨時表或循環。如果你能澄清你的邏輯,那麼有人可能會提供幫助。 – Pondlife

+0

對不起,這份工作需要臨時表。我得到的輸出是'0'。它需要至少365 –

回答

1

我不知道爲什麼你需要#DateLookup表?你可以在一年的天數如下(最好能作爲一個函數使用)

CREATE PROCEDURE usp_DateLookup 
    @StartDate DATE, 
    @Rows INT OUTPUT 

AS 
    --DECLARE @StartDate DATE = '2012-05-06' 
    select @Rows = datediff(day,@StartDate,dateadd(year,1,@StartDate)) 

END 
GO; 

根據您的評論(您需要分配臨時表),你可以做到這一點沒有環作爲下面; SQL-DEMO

CREATE PROCEDURE usp_DateLookup 
    @StartDate DATE, 
    @Rows INT OUTPUT 

AS 
    --DECLARE @StartDate DATE = '2012-05-06' 
    DECLARE @Rows INT = DATEDIFF(day,@StartDate,dateadd(year,1,@StartDate)) 

    CREATE TABLE #DateLookup 
    (
     DateID INT IDENTITY (1,1), 
     DateDescription DATE 
    ) 

    ;with Digits as (
    select Digit 
    from (
     values (0), (1), (2), (3), (4), (5), 
      (6), (7), (8), (9)) as t(Digit)), 
    Numbers as (
     select u.Digit + t.Digit*10 +h.Digit*100 as Number 
     from Digits u 
     cross join Digits t 
     cross join Digits h 
    ) 
    insert into #DateLookup 
    select dateadd(day,Number+1,@StartDate) from Numbers where Number < @Rows 
    order by Number 

END 
GO; 

您還需要一個LOOP?你INSERT失敗,因爲你試圖輸入一個數字(DAY(@todaysDate)+ @countIndex)到DATE

INSERT #DateLookup (DateDescription) 
    VALUES ('this-should-be-a-valid-date') 
+0

它是一個要求創建表的作業分配:/ –

+0

你是否已經創建了該表?並且每次運行此程序時都需要填寫?每次運行時都不能創建臨時表而不檢查其存在。 – Kaf

+0

由於臨時表,不會有錯誤。它只存在於程序的範圍內,並在退出時丟棄。這是[記錄](http://msdn.microsoft.com/en-us/library/ms191132(v = sql.105).aspx),但一個簡單的例子很容易地顯示;你可以反覆運行這個過程,沒有任何錯誤:'create proC#p as create table #t(i int)' – Pondlife

相關問題