今天老板叫我查询未来三个月的产品剩余情况,因为我们的产品是可以根据日期预定购买的 而每天的产品数量都是一样的。就像你去电影院看电影,电影院有100个座位,我提前订票,那么今天的剩余座位 和明天的是不冲突的,但是剩余可订的座位你要显示给用户看啊 ,是不是。相信你在美团网之类购买电影票的都知道流程。
但是呢 你应该怎么把未来三个月的数据全都查出来呢 ?
你不可能直接在客户端写90条sql查询语句吧!这不科学啊 是不是,那么老板教我的我也就分享出来,有不足或有更好的建议请多多指教
这里给出存储过程的源代码
use databaseName
go
createproc [dbo].[sp_getwhileloop]//创建存储过程
@productid as bigint //需要传进来的参数
as
declare @i as integer
declare @date as datetime
declare @num as int
declare @stklvl as int
declare @stk as int
declare @isEn as varchar
set @i = 0
set @date = getdate();
--这里创建一个虚拟的表 待会需要存数据
create table #tempdate
(orderdate smalldatetime,
havestock nvarchar(2))
--后三个月的天数 //这里主要是要循环的次数
while (@i < datediff(dd , getdate(), dateadd(mm, 3,getdate())))
begin
set @i = @i + 1--当@i大于三个月的天数了就不会进来再执行了
set @date = dateadd(day, 1, @date)--这是循环一次天数就会+1
set @num=(select count(*) from torderdata as o,mproduct as p where
convert(varchar(10),o.enddate,120)>=convert(varchar(10),getdate()+@i,120)
and o.productid=p.productid and p.productid=@productid)--这是我要在表中获取到的数据1
set @stklvl = ( select top 1 p.stksafetylvl
from torderdata as o,mproduct as p where
convert(varchar(10),o.enddate,120)>=convert(varchar(10),getdate()+@i,120)
and o.productid=p.productid and p.productid=@productid ) --这是我要在表中获取到的数据
set @stk = ( select top 1 p.StkLvl
from torderdata as o,mproduct as p where
convert(varchar(10),o.enddate,120)>=convert(varchar(10),getdate()+@i,120)
and o.productid=p.productid and p.productid=@productid )--这是我要在表中获取到的数据3
--这里的条件判断也是我要赋值返回去的值
if(@stk -@num>20)
begin
set @isEn='Y'
end
if(@stk -@num<=20 and @stk -@num>0)
begin
set @isEn='N'
end
--循环一次之后需要的数据该有的都有了 把需要的数据按照你上面创建虚拟的表插入进去
insert into #tempdate (orderdate, havestock) values (@date, @isEn)
set nocount on;
end
--最后你调用这个存储过程这里会把所有数据 (90条)返回给你
select * from #tempdate
--最后删除你创建的临时表
drop table #tempdate
你在调用时 需要自己写一个model类 类里面的属性你需要和临时表里的字段属性相对应,因为你接收到的是一个集合数据
这样,就能解决你的客户端的性能问题了 不过这里牺牲了服务端,但我们的服务端有那么强大
希望你有更好的建议,谢谢