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)
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)
没有找到相关结果
重要提示:提问者不能发表回复,可以通过评论与回答者沟通,沟通后可以通过编辑功能完善问题描述,以便后续其他人能够更容易理解问题.
3 个回复
悟 - 取是能力,舍是境界 2015-10-14 回答
赞同来自:
比如char(20) 你给个201501 实在上存储的值是201501+14个空格。
另外你datem这个列是自己测试时候写错没有删除吧。
flybi_xw - 挑战极限,人生终将辉煌。 2015-10-14 回答
赞同来自:
char(10)当数据不够10位的时候,会在后面补空格补够10位。
所以datem+'01' 的结果是'201203 01'而不是你想要的‘20120301’
所以转换不成日期了。
2.看你数据的固定格式,where 中取left(datem,4)与left(@yy,4)应该都是年份了。
chak 2015-10-14 回答
赞同来自: