我在WinForms应用程序(vb.net)中使用调度程序(日历),并将约会(startDateTime和endDateTime)保存到MySql数据库中。
在进行约会的过程中,我需要检查在特定日期的特定时间段(分钟)内是否有特定资源(例如会议室)。
我在这里寻找了适合我的情况的可能解决方案,但是,所有解决方案都与在特定时间段内搜索条目有关。
余存储开始时间和结束时间预约到DB以及任何所需的资源对于预约。
我可以拥有多个资源(例如:多个房间),并且希望在该时间段内无法使用默认(或选定房间)资源的情况下,找到一个房间的时间未分配。
时间段从10分钟到2个小时不等,但这始终是约会和资源类型的固定时间段,例如: 任命:董事会会议
资源:董事会会议室
开始时间: 2019年2月2日九点00分00秒
结束时间: 2019年2月2日10:00:00
任何帮助将不胜感激。
我喜欢的代码
SELECT (TIME(b.appStartTime) - TIME(a.appEndTime)) as timedifference,
a.appID, a.appOwnerKey, a.appEndTime, b.appStartTime, a.appSubject,
a.appDescription, a.appToolTip, a.appCategory, a.appImg, a.appPatWaiting
FROM cusAppointments a
INNER JOIN cusAppointments b ON b.appID = (a.appID + 1)
WHERE (DATE(a.appStartTime) = DATE(NOW()) AND
DATE(b.appEndTime) = DATE(NOW()))
AND (TIME(b.appStartTime) - TIME(a.appEndTime)) >= 15000
AND a.appOwnerKey = 'Admin .'
ORDER BY a.appStartTime ASC;
编辑: 这是行不通的,因为在我看来,我应该使用在StartTime上排序的同一表的两个记录集,然后从RecordSet B的rowid + 1的StartTime中减去RecordSet A的rowid的EndTime。
答案 0 :(得分:0)
经过深思熟虑,意识到有些事情我没有考虑,我决定将处理工作交给客户。
我没有考虑的因素: 1. StartOfDay时间(办公时间开始) 2. EndOfDay时间(办公时间结束) 3.获取首次预订-检查“首次预订”与StartOfDay之间的未分配时间段 4.获取上次预订-检查上次预订到EndOfDay之间的未分配时间段
我使用了一个简单的If..Else语句块来实现该逻辑,并且只需要11条代码行即可检查所有内容。 首先,我检查“首次预订”,然后检查我是否在“首次预订”的StartTime和StartOfDay时间之间有一个开放时间段。
第二次检查用于最后一次预订,以查看最后一次预订的EndTime和EndOfDay时间之间是否有空位。
第三部分是处理第一次预订和最后一次预订之间的所有预订。 (1)检查在第一个返回的记录和Start Of Day之间是否存在一个TimeSlot '-检查我们是否有第一条记录(j = 0) '-检查myEndTime是否小于或等于第一条记录的dbStartTime '-检查myStartTime是否大于或等于StartOfDay '-检查第一个记录的dbStartTime与StartOfDay之间的时差,并检查是否 'myTimeSlot小于或等于该时间
If j = 0 AndAlso myEndTime <= dbStartTime AndAlso
myStartTime >= StartOfDay AndAlso (dbStartTime - StartOfDay) >= myTimeSlot Then
txtResults.AppendText("Found Time Slots" & vbCrLf)
'Check for LAST record and do similar as for FIRST record
ElseIf j = clReadFromDB.tmsData.Rows.Count - 1 AndAlso myEndTime <= EndOfDay AndAlso
(EndOfDay - dbEndTime) >= myTimeSlot Then
txtResults.AppendText("Found Time Slots" & vbCrLf)
'Check for a time slot inbetween the FIRST and LAST record
' - We don't have to bother with checking for StartOfDay or EndOfDay
' - Check if myStartTime >= dbEndTime of the Current Record (j)
' - Check if myEndTime <= dbStartTime of the Next Record (j+1)
' - Check if myTimeSlot is <= to the time difference between dbDStartTime of Current Record
' and dbStartTime of the Next Record
ElseIf myStartTime >= clReadFromDB.tmsData.Rows(j).Item(2) AndAlso
myEndTime <= clReadFromDB.tmsData.Rows(j + 1).Item(1) AndAlso
(clReadFromDB.tmsData.Rows(j + 1).Item(1) - clReadFromDB.tmsData.Rows(j).Item(2)) >= myTimeSlot Then
txtResults.AppendText("Found Time Slots" & vbCrLf)
lblStatus.Text = Convert.ToString(clReadFromDB.tmsData.Rows(j + 1).Item(1) - clReadFromDB.tmsData.Rows(j).Item(2))
Else
lblStatus.Text = "Time Slot not found"
txtResults.AppendText("Time Slot Not Found" & vbCrLf)
End If
我将上面的代码用作基础逻辑,因为这贯穿数据库上的所有预订。它还使用“首次预订”作为初始检查,而不是用户为新预订选择的“日历时间”。
感谢那些尝试提供帮助的人,尽管您的建议并没有使我更接近MySQL解决方案,但是它的确扩大了我对MySQL的了解。