我们去年编写的sql脚本现已停止工作,因为我们在2014年出现以下错误“将varchar数据类型转换为日期时间数据类型导致超出范围的值”
我不熟悉SQL,错误消息指向脚本的这一部分。
declare @current_fiscal datetime
set @current_fiscal =
case
when (month(getdate()) < 7) then
cast(dateadd(year,-1,year(getdate())) as varchar(4)) + '0702'
else
cast(year(getdate()) as varchar(4)) +'0702'
end
我不确定'0702'的目的是什么。期待听到某人的声音。
答案 0 :(得分:4)
他们显然是在七月或更晚的时候写过,而且从未测试过表达的前半部分。
cast(dateadd(year,-1,year(getdate())) as varchar(4)) + '0702'
应该是:
cast(year(dateadd(year,-1,getdate())) as varchar(4)) + '0702'
甚至更容易:
CAST(YEAR(GETDATE())-1) AS CHAR(4))
顺便说一句,通过一点调试101,您可以立即发现问题:
DECLARE @current_fiscal VARCHAR(32);
SET @current_fiscal = cast(dateadd(year,-1,year(getdate())) as varchar(4)) + '0702';
PRINT @current_fiscal;
结果:
--------
Jul 0702
现在,为什么这样做,你可能会问?让我们检查表达式的每个部分:
YEAR(GETDATE()) = 2014
DATEADD(YEAR,-1,2014) actually turns 2014 into a date, which is:
DATEADD(DAY, 2014, '19000101') = '1904-07-08'
Now, subtract a year from that, you get '1903-07-08'
Now, cast that as a varchar(32) without a style, you get:
SELECT CONVERT(VARCHAR(32), CONVERT(DATETIME,'1903-07-08'));
Which is Jul 8 1903 12:00AM
The first 4 characters are Jul and a space.
答案 1 :(得分:0)
他们搞砸了7月前的函数调用顺序。鉴于此代码的级别,我怀疑您将在未来发现其他问题。但这应该有用:
declare @current_fiscal datetime
set @current_fiscal = case when (month(getdate()) < 7) then cast(year(dateadd(year,-1,getdate())) as varchar(4)) + '0702' else cast(year(getdate()) as varchar(4)) +'0702' end