将过滤器设置为当前财政年度时的日期时间错误(01July2013 - 2014年6月30日)

时间:2014-01-07 20:48:56

标签: sql datetime

我们去年编写的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'的目的是什么。期待听到某人的声音。

2 个答案:

答案 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