Vb.net 检查多个日期范围对象之间的日期重叠

Vb.net 检查多个日期范围对象之间的日期重叠,vb.net,linq-to-objects,Vb.net,Linq To Objects,我在数据库中有几个记录,它们有开始日期和结束日期 09/15/2011 - 09/30/2011 10/15/2011 - 10/22/2011 11/01/2011 - 11/15/2011 当用户存储记录时,我需要确保日期不重叠。 我的简单代码检查特定记录中的日期范围(例如,用户输入2011年9月16日或2011年10月21日,我抛出一个异常。) 但是,用户获得创意的机会微乎其微(例如,2011年10月14日-2011年10月23日,甚至2011年10月14日至2011年11月16日),现

我在数据库中有几个记录,它们有开始日期和结束日期

09/15/2011 - 09/30/2011
10/15/2011 - 10/22/2011
11/01/2011 - 11/15/2011
当用户存储记录时,我需要确保日期不重叠。 我的简单代码检查特定记录中的日期范围(例如,用户输入2011年9月16日或2011年10月21日,我抛出一个异常。)

但是,用户获得创意的机会微乎其微(例如,2011年10月14日-2011年10月23日,甚至2011年10月14日至2011年11月16日),现在他们绕过了我的检查

顺便说一句,如果用户正在编辑包含2011年10月15日-2011年10月22日值的记录,则可以输入2011年10月14日至2011年10月23日

所以,我试图用linq查询来解决这个谜题。然而,我所拥有的并不完全正确


更新不要担心代码不起作用。在试图提供一个例子来扩展Miika的repsonse时,我找到了我的答案。因此,感谢Miika为我指明了正确的方向,并在下面发布了我的工作代码:

这是我的密码:

        Private Sub CheckForOverlap(myMonth As Messages.MyMonth)


                        Dim am As New MyMonth()
                        Dim amCollection As Messages.MyMonthCollection
                        Dim overlappingMyMonthDate As Boolean = False
                        Dim sErrorMsg As String = ""

'...non-applicable code omitted

    Dim query = From s In amCollection _
                                 Let s1 As MyMonth = CType(s, MyMonth) _
                                 Where s1.AttendanceMonthID <> attendanceMonth.AttendanceMonthID And _
                                 (CDate(attendanceMonth.StartDate) < CDate(s1.StartDate) And CDate(attendanceMonth.EndDate) > CDate(s1.EndDate)) _
                                 Select s1

                If query.Count > 0 Then
                    sErrorMsg = "Dates entered surround another entry"
                End If

                        If overlappingMyMonthDate Then
                            Throw New Exception(sErrorMsg)
                        End If

                    End Sub


                End Class
Private Sub CheckForOverlap(myMonth作为Messages.myMonth)
Dim am作为新的MyMonth()
Dim amCollection As Messages.MyMonthCollection
Dim overlappingMyMonthDate作为布尔值=False
Dim SERRORMG As String=“”
“…省略了不适用的代码
Dim query=来自amCollection中的_
设s1为MyMonth=CType(s,MyMonth)_
其中s1.AttendanceMonthID attendanceMonth.AttendanceMonthID和_
(CDate(attendanceMonth.StartDate)CDate(s1.EndDate))_
选择s1
如果query.Count>0,则
sErrorMsg=“输入的日期与另一个条目相邻”
如果结束
如果重叠MyMonthDate,则
抛出新异常(sErrorMsg)
如果结束
端接头
末级

这一切都归结于LINQ查询。

您需要在代码中完成,还是选择SQL?如果数据在数据库中,可以使用以下查询检查重叠

SELECT COUNT(*)
FROM Table1
WHERE Table1.StartDate < 'endCheckDate'
    AND Table1.EndDate > 'startCheckDate'
选择计数(*)
来自表1
其中表1.StartDate<'endCheckDate'
和表1.EndDate>“开始检查日期”

这将返回找到的重叠数的计数。”endCheckDate和startCheckDate是新的查询值(日期格式)。如果数据位于内存中的对象集合中,那么可以使用LINQ。如果您需要LINQ语句的帮助,请告诉我。

我需要用代码完成它,所以我尝试了LINQ。它不起作用,所以我更新了我的问题,以便你可以看一看。在这个过程中,我发现了我的问题并解决了它…哈哈。谢谢。标记作为答案。