2013-10-03 82 views
0

我試圖將日期和月份與年份連接,我需要檢查每條記錄以查找財務年。當我執行查詢時,它顯示(varchar數據類型轉換爲日期時間數據類型導致超出範圍的值)錯誤。請幫我找到問題。將varchar數據類型轉換爲日期時間數據類型導致超出範圍的值異常

代碼

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-01-08 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

相關問題