【问题标题】:The conversion of a varchar data type to a datetime data type resulted in an out-of-range value exception将 varchar 数据类型转换为 datetime 数据类型导致超出范围的值异常
【发布时间】:2014-06-02 13:56:27
【问题描述】:

我试图将日期和月份与年份连接起来,我需要检查每条记录以找到财政年度。当我执行查询时,它显示(将 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)

【问题讨论】:

  • 当然,我不知道所涉及的表的架构,但我怀疑这个查询,即使在正确计算年份之后,也可能会返回许多重复项。此外,您不会返回AccountId - 您现在将如何将AmountAccountId 相关联?如果您详细说明您正在尝试做什么,添加到问题数据样本和使用的表的架构,我们可能会建议一个更好的解决方案。

标签: sql-server datetime


【解决方案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) )

【讨论】:

  • 我仍然面临同样的超出范围值异常。
  • @Deva,查询中有第二个地方发生了同样的问题。我已经为您更新了最后一个示例。
  • 即使包含更新后的查询,我仍然面临同样的问题。
  • 再试一次。没有返回 bb 的年份。年份,整个日期都是。
猜你喜欢
  • 2011-11-12
  • 2016-02-08
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
相关资源
最近更新 更多