使用VB在MSSql中搜索可用性的建议

时间:2013-04-23 08:45:26

标签: sql-server vb.net

对于管理预订的最合适方法,我将不胜感激。

我正在添加一个用VB编写的带有MSSql DB的现有程序。

我目前正在使用win窗体作为GUI,利用DataGridView显示带有Month控件的数据。

我当前的数据库架构是:

bikeDetail (bikeID (PK), bikeName, bikeColour, bikeStyle, bikeNotes)

bikeMovements (bikeMovementID (PK), bikeID, customerID, bikeMovementType, bikeMovementDate, bikeMovementAMPM, bikeMovementNotes).

customer (customerID, ..., ...)

这个想法是,每次进入或离开自行车时,都会在bikeMovements数据库中记录。这可能不是保存这些数据的最简单方法,但它应该意味着数据库不会因大量重复数据而膨胀。

我的问题是,我正在努力找出搜索自行车运动表的最佳方法,以便了解自行车是否进出,因此可以预订。使用日历工具,我可以选择一系列日期。

到目前为止,我已经能够通过使用SQL查询确定某个日期是否有自行车可用,但不能用于日期范围。

当前的SQL查询:

    SELECT * FROM tb_bikeMovements as bm, tb_bikeDetail as bd
    WHERE bm.bikeMovementDate < '" + startDate + "'
    and bm.bikeID = bd.bikeID
    and bm.bikeMovementType = 1 

返回当天可用的自行车。 (bikeMovementType 1是回来的自行车,因此可用)。

我很感激任何有关更好的SQL查询以获取可用性的建议,或者更好的设置数据库的方法,这将使查询更简单。

示例日期:

自行车1于4月22日熄火,并于4月24日预订(4月25日起) 自行车2号于4月22日熄火,并于4月28日(4月29日起)预订 3号自行车3号于4月26日开出,并于4月27日预订(4月28日起) 自行车4从4月22日开始提供。

4月25日至29日有哪些自行车可用? (应该是自行车1和4。自行车1很容易,自行车3是美中不足的,因为它在选定的日期范围内熄灭!)。

我认为最简单的方法是更改​​我的数据库架构,以便为自行车预订的每一天创建一条记录。这将使搜索可用性变得更加容易,但会使表格变得更加臃肿(目前每个自行车租用2个记录,进出),并记录每天自行车出来的情况。为了公平起见,我们还不确定这些自行车将被租用多少天,这将对我的决定产生影响。

任何建议都会感激不尽!

1 个答案:

答案 0 :(得分:1)

如果我理解正确的话,如果在所需的日期范围内有一个移动记录(在外面或在里面),则自行车不可用(它在返回后的第二天可用) 如果最后一次移动记录不存在,它也不可用

查询

select distinct bikeid from bikemovements where bikeMovementDate between '25 April 2013' and '29 April 2013'

会给4月25日至29日之间进出的自行车

所以我们可以通过使用“not in”找到可用的自行车来否定这一点

select * from bikeDetail where bikeid not in (
  select distinct bikeid from bikemovements where bikeMovementDate between '25 April 2013' and '29 April 2013'
) 

但是我想我们还应该检查一辆自行车是否已经预订并且没有进入

这将获得每辆自行车的最后一个运动日(直到开始日期)

  select bikeid bid, max(bikemovementdate) bmd from bikemovements
  where bikemovementdate < '25 April 2013' 
  group by bikeid) lastmove 

并查找我们可以的移动记录

select * from bikemovements join 
(
  select bikeid, max(bikemovementdate) bmd from bikemovements
  where bikemovementdate < '25 April 2013' 
  group by bikeid
) lastmove 
on lastmove.bikeid=bikemovements.bikeid and 
   lastmove.bmd=bikemovements.bikemovementdate

只查找最后一次移出

的那些
select bikemovements.bikeid from bikemovements join 
(
  select bikeid, max(bikemovementdate) bmd from bikemovements
  where bikemovementdate < '25 April 2013' 
  group by bikeid) lastmove 
on lastmove.bikeid=bikemovements.bikeid and 
   lastmove.bmd=bikemovements.bikemovementdate
where bikeMovementType = 'out'

所以把它们放在一起我们可以有一些基本的东西

select * from bikeDetail where bikeid not in (
select distinct bikeid from bikemovements 
  where bikeMovementDate between '25 April 2013' and '28 April 2013'
  ) 
and bikeid not in ( 

select bikemovements.bikeid from bikemovements join 
(
  select bikeid, max(bikemovementdate) bmd from bikemovements 
  where bikemovementdate < '25 April 2013' 
  group by bikeid
) lastmove 
 on lastmove.bikeid=bikemovements.bikeid and 
   lastmove.bmd=bikemovements.bikemovementdate
 where bikeMovementType = 'out'
)

sql fiddle