sql 数据补全,程序查错

[复制链接]
查看11 | 回复3 | 2010-9-8 13:11:40 | 显示全部楼层 |阅读模式
有一张表 id
date
num

11
2008-2-1 231

11
2008-10-231231654

32
2008-3-4
312123

32
2008-12-5 1321
通过语句补充数据

11
2008-1-1
null

11
2008-1-2
null

11
一直往下
null
就是没有日期的数据,在同一个id后面要求时间连续,没有的数据以空填入
要写怎样的sql语句 下面这个段错在哪里,怎么改,或者写下新的
declare @id varchar(50)--声明id变量
declare @date datetime--声明日期变量
declare @tempdate datetime--声明临时日期变量
declare addDatas cursor--声明一个游标
for select id,min(date) from tableName group by id
open addDatas--打开游标
fetch next from addDatas into @id,@date--取下一行数据到变量中
while @@fetch_status=0--如果有数据
begin
set @tempdate=dateadd(dd,1,@date)--临时日期变量赋值上一日期变量的天数加1
while datediff(mm,@date,@tempdate)=0--如果和上一日期是同一个月,则开始循环增加
begin
declare @countNum int--声明统计变量
select @countNum =count(*) from tableName where id=@id and date=@tempdate
if isnull(@countNum,0) <=0--如果该id下的该日期不存在则插入
begin
exec('insert into tableName(id,date,num) values('+@id+','+@tempdate+',null)')
end
set @date=@tempdate
end
fetch next from addDatas into @id,@date
end
close addDatas--关闭游标
deallocate addDatas--释放游标
程序运行不报错,一直运行,好像是死循环了
高手给写一个具体点的

回复

使用道具 举报

千问 | 2010-9-8 13:11:40 | 显示全部楼层
试试我这个,我已经测试通过:declare @id varchar(50)--声明id变量declare @date datetime--声明日期变量declare @tempdate datetime--声明临时日期变量declare addDatas cursor--声明一个游标for select id,min(date) from tableName group by idopen addDatas--打开游标fetch next from addDatas into @id,@date--取下一行数据到变量中while @@fetch_status=0--如果有数据begin set @temp
回复

使用道具 举报

千问 | 2010-9-8 13:11:40 | 显示全部楼层
先说一下思路首先用按id group by ,选出相同id的最大时间和最小时间,在这个语句上做游标循环,在循环中把最小时间加1,直到等于最大时间,每条进行插入。declare @id varchar(50)--声明id变量declare @mindate datetime--声明日期变量declare @maxdate datetime-
回复

使用道具 举报

千问 | 2010-9-8 13:11:40 | 显示全部楼层
select min(getdate()) 得到的结果是2010-08-23 12:09:19.560,你是一判断日期的天数,然而datediff(mm,@date,@tempdate)比较的是两个日期的差距,这样的话,结果不可能得到0,只能是相差一个月的时间了,所以要该动一下,截取天数然后进行比较。 你把while datediff(mm,@dat
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行