2013-10-03 2 views
0

날짜와 월을 연과 연결하려고 했으므로 각 레코드를 확인하여 재무 레코드를 확인해야합니다 년. 쿼리를 실행하면 () varchar 데이터 형식을 datetime 데이터 형식으로 변환하면 범위를 벗어나는 값이 발생했습니다 ..) 오류가 발생했습니다. 문제를 찾아 내도록 도와주세요.varchar 데이터 형식을 datetime 데이터 형식으로 변환하면 범위를 벗어나는 값 예외가 발생했습니다

코드

set @SiteFileVal1='04-01' 
    set @SiteFileVal2='03-31' 
    set @SiteFileYear='2013' 

    SELECT bb.Amount 
    FROM Budget bb 
    JOIN Invoice i ON i.AccountId=bb.AccountId 
    WHERE bb.AccountId=i.AccountId 
    AND bb.Year= 
    (SELECT CASE WHEN (i.Date >= convert(datetime,@SiteFileVal1+'-'+convert(varchar(200),DATEPART(yyyy,i.Date))) 
        AND i.Date < convert(datetime,@SiteFileVal2+'-'+convert(varchar(200), DATEADD(yyyy,1,DATEPART(yyyy,i.Date))))) THEN year(@SiteFileYear) ELSE DATEADD(yyyy,-1,DATEPART(yyyy,i.Date)) END) 
+0

당연히, 나는 관련 테이블의 스키마를 모른다.하지만이 쿼리는 연도가 올바르게 계산 된 후에도 많은 중복을 반환 할 수있다. 게다가, 당신은'AccountId'를 반환하지 않습니다 - 어떻게'Amount'가'AccountId'와 관련이 있습니까? 질문 데이터 샘플과 사용 된 테이블의 스키마를 추가하여 정확히 무엇을하려고하는지 자세히 설명해 주면 더 나은 해결책을 제안 할 수 있습니다. –

답변

1

이 부분은 잘못된 것입니다 : 은 DATEADD (YYYY, -1, DATEPART (YYYY, i.Date가))

DATEADD이 전달 날짜를 예상하고 있습니다 단지 날짜의 연도를 전달 -

DATEPART(yyyy, i.Date)이 코드를 사용하여, 내가 그랬어 :

select DATEADD(yyyy,-1,DATEPART(yyyy,'1/8/2007')); 

결과가 좋지 않습니까? 1904년 7월 1일 00 : 00 : 00.000

나는 다시 한 달/일 추가, 이것은 내가 무엇을 얻을 수 있습니다 :

select DATEADD(yyyy,-1, CAST(DATEPART(mm, '1/8/2007') as varchar) + '/' + 
CAST(DATEPART(DD, '1/8/2007') as varchar) + '/' + 
cast(DATEPART(yyyy,'1/8/2007') as varchar)) 

결과 : 2006년 1월 8일 00 : 00 : 00.000

이것은 쿼리에 대한 많은 구문 분석이지만 필요한 것은 사용자가 원하는대로 사용자의 열로 형식을 지정하는 것입니다.

set @SiteFileVal1='04-01' 
set @SiteFileVal2='03-31' 
set @SiteFileYear='2013' 

SELECT bb.Amount 
FROM Budget bb 
JOIN Invoice i ON i.AccountId=bb.AccountId 
WHERE bb.AccountId=i.AccountId 
    AND bb.Year= 
DatePart(yyyy, 
(CASE WHEN (i.Date >= convert(datetime,@SiteFileVal1+'-'+convert(varchar(200),DATEPART(yyyy,i.Date))) 
       AND i.Date < convert(datetime,@SiteFileVal2+'-'+convert(varchar(200), DATEADD(yyyy,1,CAST(DATEPART(mm, i.Date) as varchar) + '/' + 
     CAST(DATEPART(DD, i.Date) as varchar) + '/' + 
      cast(DATEPART(yyyy,i.Date) as varchar))))) 
      THEN year(@SiteFileYear) ELSE 
DATEADD(yyyy,-1, CAST(DATEPART(mm, i.Date) as varchar) + '/' + 
     CAST(DATEPART(DD, i.Date) as varchar) + '/' + 
     cast(DATEPART(yyyy,i.Date) as varchar)) END)) 
+0

여전히 동일한 범위를 벗어난 값에 직면하고 있습니다. – DonMax

+0

@Deva, 동일한 문제가 발생한 쿼리의 두 번째 지점이있었습니다. 마지막 예제를 업데이트했습니다. – ps2goat

+0

여전히 업데이트 된 쿼리를 포함시킨 후에도 동일한 문제에 직면하고 있습니다. – DonMax

관련 문제