2013-02-01 3 views
-1

중복 된 것처럼 보이지만 프로 시저 내부에서 임시로 만든 테이블의 행 수를 계산하려고합니다.두 날짜 사이의 날짜를 계산하는 절차

(주의 : 표는 잘못 코딩되었을 가능성이 큽니다.) @rows 변수는 계산해야하며 @StartDate 변수에서 1 년의 정확한 일수를 출력해야합니다. (윤년 포함).

@StartDate 변수 다음에 정확히 1 년 동안 매일 테이블에 대해 INSERT 날짜가 VALUES이어야합니다.

임시 할당 표가이 지정에 필요합니다. 미안하지만 선생님이 요구하는 것입니다.

는 참고 : 나는 초보자 해요, 도움 주시면 감사하겠습니다 :) 당신이 #DateLookup 테이블이 필요한 이유

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' 테이블이 필요합니까 DATE 필드에 숫자 (DAY(@todaysDate)+ @countIndex)를 입력하려고하기 때문에 실패? 이 절차를 실행할 때마다이 테이블을 만들 것입니다. 당신은 그것을 내려야 만합니다 – Kaf

+1

당신의 프로 시저에는 문제가 가득 찼지만 현재의 문제점 (오류? 잘못된 결과?) 또는 프로 시저가 기대하는 바가 무엇인지는 말하지 않았습니다. 당신은 특정 날짜와 그 다음날 같은 날 사이의 일수를 세는 것을 원하지만,'DATEDIFF()'와'DATEADD()'만 필요하다면 임시 테이블이나 루핑이 필요 없다. . 논리를 명확히 할 수 있다면 누군가가 도움을 줄 수 있습니다. – Pondlife

+0

죄송합니다. 임시 테이블이 필요합니다. 출력은 '0'입니다. atleast가되어야합니다. –

답변

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-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; 

또한 루프가 필요합니까? 귀하의 INSERT

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

관련 문제