Sql server 将varchar数据类型转换为datetime数据类型导致值超出范围异常

Sql server 将varchar数据类型转换为datetime数据类型导致值超出范围异常,sql-server,datetime,Sql Server,Datetime,我试图将日期和月份和年份连接起来,我需要检查每个记录以查找财政年度。当我执行查询时,它显示了varchar数据类型到datetime数据类型的转换,导致值超出范围。错误请帮我找出问题所在 代码 这部分内容不正确: DATEADDyyyy,-1,DATEPARTyyyy,i.Date DATEADD需要传入一个日期,而您只传入日期的年份-DATEPARTyyyy,i.date 使用您的代码,我做到了: select DATEADD(yyyy,-1,DATEPART(yyyy,'1/8/2007')

我试图将日期和月份和年份连接起来,我需要检查每个记录以查找财政年度。当我执行查询时,它显示了varchar数据类型到datetime数据类型的转换,导致值超出范围。错误请帮我找出问题所在

代码

这部分内容不正确: DATEADDyyyy,-1,DATEPARTyyyy,i.Date

DATEADD需要传入一个日期,而您只传入日期的年份-DATEPARTyyyy,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) )

我仍然面临着同样的超出范围的值异常。@Deva,在查询中还有第二个点发生了同样的问题。我已经为您更新了最后一个示例。即使包含了您更新的查询,我仍然面临相同的问题。请重试。没有为bb返回年份。年份,整个日期都是。当然,我不知道涉及的表的架构,但我怀疑这个查询,即使在正确计算年份之后,也可能返回许多重复的数据。此外,您没有返回AccountId–您现在将如何确定哪些金额与AccountId相关?如果您详细说明了您正试图做什么,添加到问题数据样本和所用表的模式中,我们可能会建议一个更好的解决方案。
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) )