-1

冗長に思えますが、プロシージャ内で一時的に作成されたテーブルの行をカウントしようとしています。

(注: テーブルが間違ってコーディングされている可能性が高いです)@rows変数をカウントする必要があり、@StartDate変数から 1 年間の正確な日数を出力する必要があります。(これにはうるう年も含まれます)。

作成されたテーブルは、変数の後のちょうど 1 年間、毎日のINSERT日付にする必要があります。VALUES@StartDate

この割り当てには TEMPORARY TABLE が必要です。申し訳ありませんが、それが先生の求めていることです。

参考までに:私は初心者です。助けていただければ幸いです:)

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)
4

1 に答える 1

1

#DateLookupなぜテーブルが必要なのかわからないのですか?次のように1年の日数を取得できます(関数として使用することをお勧めします)

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-デモ

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;

また、ループが必要ですか?フィールドに数字 ( )INSERTを入力しようとして失敗しましたDAY(@todaysDate)+ @countIndexDATE

INSERT #DateLookup (DateDescription)
    VALUES ('this-should-be-a-valid-date')
于 2013-02-01T18:08:31.760 に答える