0

日付と月を年と連結しようとしていましたが、会計年度を見つけるために各レコードを確認する必要があります。クエリを実行すると、( 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)
4

1 に答える 1

1

この部分は正しくありません: DATEADD(yyyy,-1,DATEPART(yyyy,i.Date))

DATEADD日付が渡されることを期待していますが、日付の年だけを渡しています -DATEPART(yyyy, i.Date)

あなたのコードを使用して、私はしました:

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

結果?1904-07-01 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) )
于 2013-10-03T04:42:01.017 に答える