0

私のアプリでは、ユーザーが会議の予定を立てることができます。予定がデータベースに保存される前に、ユーザーは Calendar コントロールから日付を選択します。日付が選択されると、ページはデータベースからその日の予定のリストを取得し、記録された各予定の時刻を調べます。すでに予約されているタイムスロットは、ユーザーが都合のよい時間を選択する DropDownList から削除されます。

問題は私の時間比較で発生します。以下のコードのほとんどは、日付/時刻の値を取り除いて、比較できるものを取得することを目的としています。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then

        PopulateTime()
    End If
End Sub

Protected Sub PopulateTime()

    Dim db As New Database

    Dim sql As String = "select apptinterval from centres where centreid = @id"

    Dim args As New List(Of SqlParameter)
    args.Add(New SqlParameter("@id", Session("CentreID")))

    Dim dr As SqlDataReader = db.GetReader(sql, args.ToArray)

    Dim interval As Integer = 0
    If dr.Read Then
        interval = dr("apptinterval")
    End If

    Dim time = TimeSpan.FromHours(8)
    While time < TimeSpan.FromHours(17)
        time += TimeSpan.FromMinutes(interval)

        ddlAppointmentTime.Items.Add(New ListItem(time.ToString, time.ToString))
    End While
End Sub

Protected Sub calAppointmentDate_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles calAppointmentDate.SelectionChanged

    Dim seldate As String = Left(calAppointmentDate.SelectedDate, 10)
    Dim dateargs() As String = seldate.ToString.Split("/")
    Dim newdate As String = dateargs(0) & "-" & dateargs(1) & "-" & dateargs(2)

    GetTimes(newdate)
End Sub

Protected Sub GetTimes(ByVal TargetDate As String)

    Dim db As New Database

    Dim args As New List(Of SqlParameter)
    Dim sql As String = "select apptdate from appointments where apptdate between @date1 and @date2 order by apptdate"

    args.Add(New SqlParameter("@date1", TargetDate & " 12:00:00"))
    args.Add(New SqlParameter("@date2", TargetDate & " 23:59:59"))

    Dim dr As SqlDataReader = db.GetReader(sql, args.ToArray)

    If dr.HasRows Then
        dr.Read()
        For i As Integer = 0 To ddlAppointmentTime.Items.Count - 1

            If Left(ddlAppointmentTime.Items(i).Value, 5) = Mid(dr("apptdate"), 12, 5) Then
                ddlAppointmentTime.Items.RemoveAt(i)
            End If

        Next
    End If
    dr.Close()

End Sub

ここでループすると、 の値Mid(dr("apptdate"), 12, 5)が として返され01:00ます。データベースの実際の値は13:00.

この変換が行われている理由を誰かが提案できますか? 比較が失敗する原因となっているため、そのタイムスロットは DropDownList から削除されていません。

前もって感謝します!

4

1 に答える 1

0

それMidをやったのはのようです。ここに含まれる文字列への変換により、値が変更されました。

Mid次のようにSQLステートメントを削除して変更することで、これを回避しました。

Dim sql As String = "select left(CONVERT(time, apptdate, 14), 5) as apptdate from appointments"

Dim dr As SqlDataReader = db.GetReader(sql, args.ToArray)

If dr.HasRows Then
    While dr.Read

        For i As Integer = 0 To ddlAppointmentTime.Items.Count - 1

            If Left(ddlAppointmentTime.Items(i).Value, 5) = dr("apptdate") Then
                ddlAppointmentTime.Items.RemoveAt(i)
            End If

        Next
    End While

End If
dr.Close()
于 2012-06-27T09:29:13.393 に答える