对于管理预订的最合适方法,我将不胜感激。
我正在添加一个用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个记录,进出),并记录每天自行车出来的情况。为了公平起见,我们还不确定这些自行车将被租用多少天,这将对我的决定产生影响。
任何建议都会感激不尽!
答案 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'
)