【问题标题】:Search for an un-allocated time period (minutes)搜索未分配的时间段(分钟)
【发布时间】:2019-02-09 15:09:36
【问题描述】:

我在 WinForms 应用程序 (vb.net) 中使用调度程序(日历)并将约会(startDateTime 和 endDateTime)保存到 MySql DB。

在预约过程中,我需要检查某个资源(例如:房间)在特定日期的特定时间段(分钟)内是否可用。

我在这里寻找适合我的方案的可能解决方案,但是,所有解决方案都与在特定时间段内搜索条目有关。

我将约会的 StartTime 和 EndTime 以及该约会所需的任何资源存储到数据库。

我可以拥有多个资源(例如:多个房间),并且如果默认(或选定的房间)资源在该时间段内不可用,我希望能够找到具有未分配时间段的房间。

时间段可以从 10 分钟到 2 小时不等,但它始终是针对约会类型和资源设置的时间段,例如: 任命:董事会会议

资源:董事会会议室

开始时间: 02/02/2019 09:00:00

结束时间: 02/02/2019 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。

【问题讨论】:

  • @Mary:问题不在于实际计算,因为我已经对那部分进行了排序,问题是我需要计算 2 个不连续记录之间的时间差。这意味着我不能处理recID,因为预约是随机的。请参考我的编辑。

标签: mysql vb.net


【解决方案1】:

经过一番考虑并意识到我没有考虑到一些事情,我决定宁愿把处理交给客户。

我没有考虑到的事情: 1. StartOfDay Time(办公时间开始) 2. EndOfDay 时间(办公时间结束) 3. Get First Booking - 检查 First Booking 和 StartOfDay 之间的未分配时间段 4. Get Last Booking - 检查 Last Booking 和 EndOfDay 之间的未分配时间段

我使用了一个简单的 If..Else 语句块来实现逻辑,只需 11 行代码即可检查所有内容。 首先,我检查 First Booking,然后检查在 First Booking 的 StartTime 和 StartOfDay 时间之间是否有开放时间段。

第二次检查 Last Booking 以查看 Last Booking 的 EndTime 和 EndOfDay 时间之间是否有空缺。

第三部分是处理 First Booking 和 Last Booking 之间的所有预订。 (1) 检查在返回的第一条记录和开始日之间是否有可用的 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 的了解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多