求一SQL存储过程,高人们来啊

liujb526 2008-09-19 10:30:08
如:
A B
id编号 | state状态 | sdate时间 id编号 | rdate时间
1 | 0 | 2008-09-19 00:00:00 1 | 2008-09-19 09:30:00
2 | 0 | 2008-09-19 00:00:00 2 | 2008-09-19 08:30:00
3 | 0 | 2008-09-19 00:00:00 3 | 2008-09-19 10:30:00
4 | 0 | 2008-09-19 00:00:00 4 | 2008-09-19 09:10:00
1 | 0 | 2008-09-20 00:00:00 1 |
2 | 0 | 2008-09-20 00:00:00 2 | 2008-09-20 08:30:00
3 | 0 | 2008-09-20 00:00:00 3 | 2008-09-20 10:30:00
4 | 0 | 2008-09-20 00:00:00 4 | 2008-09-20 09:10:00

当我执行时,给个时间的参数。然后要取出B表的时间和给出的时间进行判断。如果B表的时间大于给定的时间,则将A表里的状态(state)改为1,否则改为0。
B表里的时间有可能为空。(可能需要三个参数,一个给定的时间参数,还有两个是当日时间的开始和结束时间“当天 00:00:01 --当天 23:59:59)
...全文
282 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2008-09-19
  • 打赏
  • 举报
回复
意思是传入二参数,
一个@startTime, 一个@endTime
如果 b 中存在一条记录的 rdate 介于 上二参数之间

则,更新 a 表对应记录的 state 为 1?

是不是这个意思。

如果不是请说明。 看了半天只能理解成这样。
liujb526 2008-09-19
  • 打赏
  • 举报
回复
update a set state= (case when (select rdate from b where rdate between @startDate and @endDate ) is null then 1 else 0 end)
where id=b.id

为什么会把以前的状态也改了呢。
liujb526 2008-09-19
  • 打赏
  • 举报
回复
楼上的把所有的全改了,我要的是只改当天的
银狐被占用 2008-09-19
  • 打赏
  • 举报
回复
如果先不考虑时间空的话,一条语句就搞定。
create table a (
id int,
state char(1),
sdate datetime
)

create table b(
id int,
rdate datetime
)
insert into a
select 1,'0',getdate()
union all
select 2,'0',getdate()
union all
select 3,'0',getdate()
union all
select 4,'0',getdate()
union all
select 1,'0',getdate()+1
union all
select 2,'0',getdate()+1
union all
select 3,'0',getdate()+1
union all
select 4,'0',getdate()+1

insert into b
select 1,getdate()
union all
select 2,getdate()
union all
select 3,getdate()
union all
select 4,getdate()
union all
select 1,getdate()+1
union all
select 2,getdate()+1
union all
select 3,getdate()+1
union all
select 4,getdate()+1

update a set a.state=(case when convert(varchar(19),a.sdate,120)=convert(varchar(19),b.rdate,120) and b.rdate>getdate() then '1' else '0' end)
from a,b
where a.id=b.id and convert(varchar(8),a.sdate,120)=convert(varchar(8),b.rdate,120)
rohan 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 liujb526 的回复:]
呵呵,谢谢各位了啊。
刚才想了下,
A                                                    B
id编号 | state状态 | sdate时间                  id编号  |  rdate时间
1  | 0        | 2008-09-19 00:00:00        1      |  2008-09-19 09:30:00
2  | 0        | 2008-09-19 00:00:00        2      |  2008-09-19 08:30:00
3  | 0        | 2008-09-19 00:00:00        3      |  2008-09-19 10:30:00
4  | 0        …
[/Quote]
-_-b

更简单了
update a set state=  (case when (select rdate from b where rdate between  @startDate and @endDate ) is null then 1 else 0 end)
where id=b.id


rohan 2008-09-19
  • 打赏
  • 举报
回复
update a set state= 
(
select
(
case when
(
SELECT top(1) isnull(rdate,getdate() FROM B where rdate between @startDate and @endDate --取得中间值 因为你这里取得是个集合,所以用top 1, isnull 如果是取空值了就取当前时间
)>@EditDate then 1 else 0 end --判断取出的值是否大于EditDate
) from b
) where id=b.id
rohan 2008-09-19
  • 打赏
  • 举报
回复
update a set state=(select (case when (SELECT top(1) rdate FROM B where rdate between  @startDate and @endDate)>@EditDate then 1 else 0 end) from b) where id=b.id

修正一下
rohan 2008-09-19
  • 打赏
  • 举报
回复
update a set state=(select (case when (SELECT top(1) rdate,getdate() FROM B where rdate between  @startDate and @endDate)>@EditDate then 1 else 0 end) from b) where id=b.id
liujb526 2008-09-19
  • 打赏
  • 举报
回复
呵呵,谢谢各位了啊。
刚才想了下,
A B
id编号 | state状态 | sdate时间 id编号 | rdate时间
1 | 0 | 2008-09-19 00:00:00 1 | 2008-09-19 09:30:00
2 | 0 | 2008-09-19 00:00:00 2 | 2008-09-19 08:30:00
3 | 0 | 2008-09-19 00:00:00 3 | 2008-09-19 10:30:00
4 | 0 | 2008-09-19 00:00:00 4 | 2008-09-19 09:10:00
1 | 0 | 2008-09-20 00:00:00 1 |
2 | 0 | 2008-09-20 00:00:00 2 | 2008-09-20 08:30:00
3 | 0 | 2008-09-20 00:00:00 3 | 2008-09-20 10:30:00
4 | 0 | 2008-09-20 00:00:00 4 | 2008-09-20 09:10:00

给两个参数,一个是每天的开始时间如:2008-09-19 00:00:01 ,一个是给定的时间:2008-09-19 10:00:00

如果今天A表编号为1的人员在10点之前打卡的话,在B表里rdate就有记录,如果没来rdate就没有记录,这时就要修改A表里编号为1的状态
futtit 2008-09-19
  • 打赏
  • 举报
回复
看得不是很明白..帮顶...
yagebu1983 2008-09-19
  • 打赏
  • 举报
回复
如果B表的时间大于给定的时间,则将A表里的状态(state)改为1,否则改为0。
更新A表的条件呢??
jiezi316 2008-09-19
  • 打赏
  • 举报
回复
我仔细看了下估计你是这个意思
Update A Set [State]=1 From A Join B On A.[ID]=B.[ID]
Where B.[RDate]>@指定的时间

你默认的就是0,所以更新为0的就可以不更新了吧

OK???
为了提高效率,尽量避免子查询和IN语句,
lovehongyun 2008-09-19
  • 打赏
  • 举报
回复
嗯,给定时间和B表里的时间进行比较,B表里的时间有可能为空。然后根据结果修改A表里的状态

呵呵
===============================

对啊.我写的就是这样的(把大于传入日期的更新一次.小于传入日期的更新一次.),
可能为空的肯定就不管了..如果要管的话你得单独处理一下.

liujb526 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lovehongyun 的回复:]
引用 15 楼 liujb526 的回复:
不太明白,是根据日期的不同计算的。你这个不比较当天日期的啊,


当我执行时,给个时间的参数。然后要取出B表的时间和给出的时间进行判断。如果B表的时间大于给定的时间,则将A表里的状态(state)改为1,否则改为0。

=======
你不就是说判断大小.然后更新a表的状态字段吗-_-!
[/Quote]
嗯,给定时间和B表里的时间进行比较,B表里的时间有可能为空。然后根据结果修改A表里的状态

呵呵
jiezi316 2008-09-19
  • 打赏
  • 举报
回复
汗,我的没有结果?
也许是我没有理解到你的意思吧
我的过程是
找出B表中时间范围在@StartDate和@EndDate之间,并且[RDate]>@EditDate
对应的ID,并将A表中对应这些ID的记录都更新为1.
应该没有啥子问题嘛



rohan 2008-09-19
  • 打赏
  • 举报
回复
update a set state=(select (case when rdate>@IDate then 1 else 0 end) from b) where id=b.id
lovehongyun 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 liujb526 的回复:]
不太明白,是根据日期的不同计算的。你这个不比较当天日期的啊,
[/Quote]

当我执行时,给个时间的参数。然后要取出B表的时间和给出的时间进行判断。如果B表的时间大于给定的时间,则将A表里的状态(state)改为1,否则改为0。

=======
你不就是说判断大小.然后更新a表的状态字段吗-_-!
liujb526 2008-09-19
  • 打赏
  • 举报
回复
不太明白,是根据日期的不同计算的。你这个不比较当天日期的啊,
lovehongyun 2008-09-19
  • 打赏
  • 举报
回复
直接两条语句ok?

否则的话.你要循环了.一条记录一条记录的比

CREATE PROCEDURE PEditOrderMenu
(
@IDate datetime)
AS
begin
update a set state状态= 1 where id in (select id from b where rdate时间>@IDate)
update a set state状态= 0 where id in (select id from b where rdate时间 <@IDate)
lovehongyun 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 liujb526 的回复:]
jiezi316 试了的,不报错但也没有结果

chouto 说的情况暂时不考虑。

lovehongyun 说的方法和我想的差不多,但是那个rdate时间不知怎么取啊。
我取的运行时报错
[/Quote]

rdate取他干啥?他就是个字段..直接update即可.

你不就是为了判断是大于或小于传入时间吗?
加载更多回复(12)

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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