Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将筛选器设置为当前财政年度(2013年7月1日至2014年6月30日)时的日期时间错误_Sql_Datetime - Fatal编程技术网

Sql 将筛选器设置为当前财政年度(2013年7月1日至2014年6月30日)时的日期时间错误

Sql 将筛选器设置为当前财政年度(2013年7月1日至2014年6月30日)时的日期时间错误,sql,datetime,Sql,Datetime,我们去年编写的sql脚本已经停止工作,因为我们在2014年遇到了以下错误“将varchar数据类型转换为datetime数据类型导致值超出范围” 我不熟悉SQL,错误消息指向脚本的这一部分 declare @current_fiscal datetime set @current_fiscal = case when (month(getdate()) < 7) then cast(dateadd(year,-1,year(getdate())) as varchar(4)

我们去年编写的sql脚本已经停止工作,因为我们在2014年遇到了以下错误“将varchar数据类型转换为datetime数据类型导致值超出范围”

我不熟悉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
declare@current\u财政日期时间
设置@current\u财政=
案例
当(月(getdate())<7)时
强制转换(dateadd(year,-1,year(getdate()))为varchar(4))+'0702'
其他的
强制转换(年份(getdate())为varchar(4))+'0702'
结束


我也不确定“0702”的目的是什么。期待有人来信

他们显然是在7月或更晚的时候写的,从来没有测试过表达的前半部分

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.

他们显然是在7月或更晚的时候写的,从来没有测试过表达式的前半部分

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.

他们把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
declare@current\u财政日期时间
设置@current_fiscal=case当(月(getdate())<7)然后将年(dateadd(year,-1,getdate())转换为varchar(4))+'0702'否则将年(getdate())转换为varchar(4))+'0702'结束

他们把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
declare@current\u财政日期时间
设置@current_fiscal=case当(月(getdate())<7)然后将年(dateadd(year,-1,getdate())转换为varchar(4))+'0702'否则将年(getdate())转换为varchar(4))+'0702'结束

我假设OP根本没有写这篇文章。@Zane这就是为什么我说“他们”:-)非常感谢Aaron的回答。我想我需要更多的练习来理解日期是如何工作的,因为我仍然不明白“19000101”)=“1904-07-08”部分是如何出现的?@user3168913我试图解释你的日期计算是如何在错误的日期结束的。您将天数添加到数字(2014),而不是日期。这个数字被解释为1900-01-01之后的许多天。我假设OP根本没有写这个。@Zane这就是为什么我说“他们”:-”非常感谢Aaron的回答。我想我需要更多的练习来理解日期是如何工作的,因为我仍然不明白“19000101”)=“1904-07-08”部分是如何出现的?@user3168913我试图解释你的日期计算是如何在错误的日期结束的。您将天数添加到数字(2014),而不是日期。这一数字被解释为1900-01-01之后的许多天。很抱歉,迟来的回复,已经被大雪覆盖,并急于测试这一点。真不敢相信事情会这么简单,第一枪就成功了你太棒了,乔!我不担心我会有其他问题,我想我会在这些问题发生时解决它们。再次感谢!很抱歉,迟来的答复,已经被大雪覆盖,并急于测试这一点。真不敢相信事情会这么简单,第一枪就成功了你太棒了,乔!我不担心我会有其他问题,我想我会在这些问题发生时解决它们。再次感谢!