检查多个日期范围对象的日期重叠

时间:2011-11-07 06:33:30

标签: 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日或10/21/2011,我抛出异常。)

但是,由于用户很有创意(例如2011年10月14日 - 2011年10月23日或2011年11月16日至2011年11月16日),现在他们已经绕过了我的支票。

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

所以,我正试图用linq查询解决这个问题。但是,我所拥有的并不完全正确。


更新没关系代码无效。在试图提供一个扩展Miika的回复的例子时,我找到了答案。所以,赞扬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

这一切都归结为LINQ查询。

1 个答案:

答案 0 :(得分:2)

您需要在代码中执行此操作还是SQL可以选择?如果数据位于数据库中,则可以使用以下查询来检查重叠。

SELECT COUNT(*)
FROM Table1
WHERE Table1.StartDate < 'endCheckDate'
    AND Table1.EndDate > 'startCheckDate'

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