mssql中统计上年数据

0
统计上一年的值,提示字符串时间转换出错,请教大神或是这个该怎么写呢

alter proc sp_datefour
@yy char(20),    --输入的格式有 年,年月
@kind varchar(10)

as
--存储过程作用说明:传入@yy参数,输入年份,统计上一年的所有的account量,表中的datem是char类型 
--@yy 可能输入两种格式  1.年 '2015'  2.年月'201501'
--所以在and条件中加了 or

--  exec sp_datefour '201501','A'

select sum(acount) from datefour 
where name = @kind
and  ( left(convert(char(10),dateadd(yy,-1,convert(date,datem+'01')),112),4) = @yy-1
   or left(convert(char(10),dateadd(yy,-1,convert(date,datem+'01')),112),6)
   = left(convert(char(10),dateadd(yy,-1,convert(date,@yy+'01')),112),6) )

测试表脚本如下:

create  table datefour
(name varchar(10),datem char(10), acount int)
 
insert into datefour values
('A','201203',25), ('A','201206',3),
('A','201209',15),('A','201304',8),
('A','201309',4),('A','201312',11),
('A','201403',7),('A','201405',21),
('A','201409',2),('A','201410',10),
('A','201503',21),('A','201509',3),

('B','201203',5),('B','201206',14),
('B','201209',6),('B','201303',9),
('B','201309',11),('B','201310',14),
('B','201405',9), ('B','201409',5),
('B','201410',9),('B','201505',2),
('B','201507',4), ('B','201509',13),

('C','201201',9),('C','201203',4),
('C','201212',11),('C','201303',3),
('C','201308',12),('C','201311',8),
('C','201312',3),('C','201403',8),
('C','201408',5),('C','201410',7),
('C','201503',14),('C','201509',25)
已邀请:
0

- 取是能力,舍是境界 2015-10-14 回答

想知道为什么嘛,@yy char(20),--输入的格式有 年,年月。好好看看varchar和char类型的区别,char类型不足位是会补充的。
比如char(20)  你给个201501 实在上存储的值是201501+14个空格。
 
另外你datem这个列是自己测试时候写错没有删除吧。
 
alter proc sp_datefour
@yy varchar(20), --输入的格式有 年,年月
@kind varchar(10)

as
--存储过程作用说明:传入@yy参数,输入年份,统计上一年的所有的account量,表中的datem是char类型
--@yy 可能输入两种格式 1.年 '2015' 2.年月'201501'
--所以在and条件中加了 or

-- exec sp_datefour '201501','A'

select sum(acount) from datefour
where name = @kind
and ( left(convert(char(10),dateadd(yy,-1,convert(date,@yy+'01')),112),4) = @yy-1
or left(convert(char(10),dateadd(yy,-1,convert(date,@yy+'01')),112),6)
= left(convert(char(10),dateadd(yy,-1,convert(date,@yy+'01')),112),6) )
[attach]8029[/attach]


QQ截图20151014172916.jpg

 
0

flybi_xw - 挑战极限,人生终将辉煌。 2015-10-14 回答

1.问题出在datem char(10)的数据类型上了。
char(10)当数据不够10位的时候,会在后面补空格补够10位。
所以datem+'01' 的结果是'201203 01'而不是你想要的‘20120301’
所以转换不成日期了。
2.看你数据的固定格式,where 中取left(datem,4)与left(@yy,4)应该都是年份了。
 
 
 
 
 
0

chak 2015-10-14 回答

char字段值上的空格已经消除了

要回复问题请先登录注册