如果您能给我一些建议,告诉我管理预订最合适的方法,我将不胜感激。
我正在添加到一个现有的程序,用VB与MSSql数据库编写。
我目前使用win forms作为GUI,利用DataGridView来显示数据与一个月的控制。
我当前的数据库模式是:
bikeDetail (bikeID (PK), bikeName, bikeColour, bikeStyle, bikeNotes)
bikeMovements (bikeMovementID (PK), bikeID, customerID, bikeMovementType, bikeMovementDate, bikeMovementAMPM, bikeMovementNotes).
customer (customerID, ..., ...)
这个想法是,每当一辆自行车被运进或运出时,就会在bikeMovements数据库中进行记录。这可能不是保存这些数据最简单的方法,但它应该意味着数据库不会因为大量重复数据而变得臃肿。
我的问题是,我正在努力找出搜索bikemomovements表的最佳方法,以便找出自行车是否在或不在,因此可以预订。使用日历工具,我可以选择一个日期范围。
到目前为止,我已经能够通过使用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号自行车4月26日出发,4月27日预订(4月28日起可用)
4月22日起,自行车4号可用。
4月25日至29日有哪些自行车可用?应该是1号和4号自行车。抓自行车1很容易,自行车3是美中不足的,因为它在选定的日期范围内进出!
我认为最简单的方法是更改我的DB模式,以便为每天预订自行车创建记录。这将使搜索可用性变得容易得多,但会使表变得更加臃肿(当前每辆自行车租用2条记录,进出),并且每天都有自行车租用的记录。公平地说,我们还不确定这些自行车能租多少天,这将影响我的决定。
任何建议将不胜感激!
如果我理解正确,那么如果在所需的日期范围内有运动记录(无论是out还是in)(它返回后的第二天可用),则自行车不可用。如果最后一个移动记录不在
,也不可用。查询
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
只查找最后移动为out的
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小提琴