两个表的数据比较问题,并根据比较结果填充第三个表?(第一个给出答案并通过验证的即得所有分)

jxc163 2003-10-18 08:34:23
有三个表,一个是原始数据表(OLD),一个计划数据表(PLAN),一个是报告表(REPORT),假设结构为:
OLD表:
编号:Char(4);
地点 : Char(10);
人员: Char(12);()
操作时间:DateTime;(2003年10月日 14点45分,即2003-10-17 14:45:00.00)

Plan表
编号:char(3);
地点:char(10);
计划时间:char(4);(1440)
误差:Integer;(10)

Report表
编号:char(4);
地点:char(10);
人员:char(12);
操作时间:DateTime;
计划时间:Char(40);
实际情况:char(40);

Report表的数据是通过OLD表的数据与PLAN表的数据一一进行比较而来,其中R.计划时间为操作日期+(P.计划时间-P.误差)至(P.计划时间+P.误差),如(17日14点30分至14点50分)。
而实际情况是比较指定地点的操作时间与计划时间,显示迟到、早到,没有操作等信息。

我说了这么多,其实简单点就像人事考勤系统中的打卡的原始档案与排班表,以及根据排班表对原始档案进行的过滤。

初学程序,不知那位高手是否可以给出SQL语句!先谢谢!
...全文
75 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxc163 2003-10-22
  • 打赏
  • 举报
回复
我再仔细研究一下。
XXSingle 2003-10-21
  • 打赏
  • 举报
回复
up.........学习
pengdali 2003-10-21
  • 打赏
  • 举报
回复
select 编号,地点,人员,操作时间, CONVERT(char(16),dateadd(mi,-误差,计划时间),120)+'至'+CONVERT(char(16),dateadd(mi,误差,计划时间),120) 计划时间,
Dateadd(mi,-误差,计划时间) 下限时间,dateadd(mi,误差,计划时间) 上限时间,
case when 操作时间 not between dateadd(mi,-误差,计划时间) and dateadd(mi,误差,计划时间) then '没有操作'
when 操作时间<dateadd(mi,-误差,计划时间) then '早到'
when 操作时间>dateadd(mi,误差,计划时间) then '迟到'
else '正常' end 实际情况
from (
select a.*,cast(CONVERT(char(10),getDate(),120)+' '+left(b.计划时间,2)+':'+right(b.计划时间,2) as datetime) 计划时间,b.误差
from #old a,#plan b where a.地点=b.地点
and convert(char(8),a.操作时间,108) between dateadd(mi,-120,left(b.计划时间,2)+':'+right(b.计划时间,2)) and dateadd(mi,120,left(b.计划时间,2)+':'+right(b.计划时间,2))
) 表名

go
jxc163 2003-10-21
  • 打赏
  • 举报
回复
大力兄,因为我想对上面的表进行操作,所以改到你写的语句, 加了一个判断条件:即
and (a.操作时间 between dateadd(mi,-120,计划时间) and dateadd(mi,120,计划时间)
以保证查询时不能找到相应的记录。但再次执行时就显示:

服务器: 消息 242,级别 16,状态 3,行 1
从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。

是什么原因呢?我觉得我的条件没有写错呀!


select 编号,地点,人员,操作时间,
CONVERT(char(16),dateadd(mi,-误差,计划时间),120)+'至'+CONVERT(char(16),dateadd(mi,误差,计划时间),120) 计划时间,
Dateadd(mi,-误差,计划时间) 下限时间,dateadd(mi,误差,计划时间) 上限时间,
case when 操作时间 not between dateadd(mi,-误差,计划时间) and dateadd(mi,误差,计划时间) then '没有操作'
when 操作时间<dateadd(mi,-误差,计划时间) then '早到'
when 操作时间>dateadd(mi,误差,计划时间) then '迟到'
else '正常'
end 实际情况
from (
select a.*,cast(CONVERT(char(10),getDate(),120)+' '+left(b.计划时间,2)+':'+right(b.计划时间,2) as datetime) 计划时间,b.误差 from old a,_plan b
where a.地点=b.地点 and (a.操作时间 between dateadd(mi,-120,计划时间) and dateadd(mi,120,计划时间))
) 表名
jxc163 2003-10-21
  • 打赏
  • 举报
回复
先谢谢大力!

关于两个表比较的问题,我已经大概明白,只是想再麻烦一下:当Old表以及Plan表中都有多条记录时,应该如何处理?
比如:
Old表:
0001 xx aaa 2003-10-21 14:45:00.00
0002 yy aaa 2003-10-21 15:30:00.00
...
0099 xx aaa 2003-10-21 21:50:00.00
0100 yy aaa 2003-10-21 22:35:00.00
...
0150 xx bbb 2003-10-22 14:50:00.00
0151 yy bbb 2003-10-22 15:35:00.00
...

Plan表
001 xx 1440 10
002 xx 2145 10
003 yy 1530 10
004 yy 2230 10
...
pengdali 2003-10-20
  • 打赏
  • 举报
回复
create table #old(编号 varChar(4),地点 varChar(10),人员 varChar(12),操作时间 datetime)
insert #old values('0001','xx','aaa','2003-10-17 14:45:00.000')
create table #plan (编号 varchar(3),地点 varchar(10),计划时间 char(4),误差 Integer)
insert #plan values('001','xx','1440',10)



select 编号,地点,人员,操作时间,CONVERT(char(16),dateadd(mi,-误差,计划时间),120)+'至'+CONVERT(char(16),dateadd(mi,误差,计划时间),120) 计划时间
case when 操作时间 not between dateadd(mi,-误差,计划时间) and dateadd(mi,误差,计划时间) then '没有操作'
when 操作时间<计划时间 then '早到'
when 操作时间>计划时间 then '迟到'
else '准时' end 实际情况
from (
select a.*,cast(CONVERT(char(10), getDate(),120)+' '+left(b.计划时间,2)+':'+right(b.计划时间,2) as datetime) 计划时间,b.误差 from #old a,#plan b where a.地点=b.地点
) tem
go


drop table #old,#plan
jxc163 2003-10-18
  • 打赏
  • 举报
回复
比如:计划在 14点45在 地点一 进行一次操作
   在OLD表中应该在14点35分到14点55分之间有一个在 地点一 进行操作的记录,如果不存在记录则表明没有进行操作。

而关键在于,我不知道如果对这两条记录进行检索比较!!
jxc163 2003-10-18
  • 打赏
  • 举报
回复
楼上的老兄,你把条件搞错一个,就是OLD表的编号与Plan表的编号是没有关系的,所以我特意说明了一个char(4),另一个是char(3)
gdwyh 2003-10-18
  • 打赏
  • 举报
回复
var tim1:datetime;


with query1 do
begin
sql.clear;
sql.add('select old.编号,old.地点,old.人员,old.操作时间,plan.计划时间,plan.误差 from old,plan where old.编号=plan.编号');
sql.open;
while not eof do
begin
query2.sql.clear;
query2.sql.add('insert report(编号,地点,人员,操作时间,计划时间) values(:编号,:地点,:人员,:操作时间,:计划时间)');
query2.Params.ParamByName('编号').Value:=FieldByName('编号');
query2.Params.ParamByName('地点').Value:=FieldByName('地点');
query2.Params.ParamByName('人员').Value:=FieldByName('人员');
query2.Params.ParamByName('操作时间').Value:=FieldByName('操作时间');
tim1:=strtotime(copy(FieldByName('计划时间'),1,2)+':'+copy(FieldByName('计划时间'),3,2)+':00');
query2.Params.ParamByName('计划时间').Value:=datetimetostr(FieldByName('操作时间'))+timetostr(tim1-FieldByName('误差'))+'至'+timetostr(tim1+FieldByName('误差'));
query2.execsql;
next;
end;

end;
datapub 2003-10-18
  • 打赏
  • 举报
回复
建议你把Report中的计划时间分成两个字段,一个计划时间起点(=p.计划时间-p.误差),计划时间终点(=p.计划时间+p.误差时间),这样要显示迟到、早到或没有操作时间就可以按下面的方式进行了,迟到为操作时间>计划时间终点,早到为操作时间<计划时间起点,没有操作为操作时间=空。而report这张表就可以通过上面的方式得到了。

2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧