2017-05-25 7 views
-1

Ich habe eine Buchungsseite und eine Reservierungstabelle, die reservationstart Spalte, reservationend Spalte und numofdays Spalte enthält.Wie kann ich Anzahl der Tage zwischen zwei Daten berechnen?

Ich habe die Anzahl der Tage zwischen den beiden Daten ermittelt, die ein Client auswählen, wird aber nichts wurde in der Tabelle gespeichert, wenn ich aktualisieren.

Der Datentyp von numofdays war datatime, aber ich habe dies zu int geändert.

benutzte ich diese erste, das Start- und Enddatum zu erklären:

DayPilotScheduler1.Scale = TimeScale.Manual 
Dim start As New Date(Date.Today.Year, 1, 1, 12, 0, 0) 
Dim [end] As Date = start.AddYears(1) 

Dies ist der Code für das Update:

Protected Sub DayPilotScheduler1_EventMove(ByVal sender As Object, ByVal e As DayPilot.Web.Ui.Events.EventMoveEventArgs) 
    Dim id_Renamed As String = e.Value 
    Dim start As Date = e.NewStart 
    Dim [end] As Date = e.NewEnd 
    Dim resource As String = e.NewResource 

    Dim message As String = Nothing 

    If Not dbIsFree(id_Renamed, start, [end], resource) Then 
     message = "The reservation cannot overlap with an existing reservation." 
    ElseIf e.OldEnd <= Date.Today Then 
     message = "This reservation cannot be changed anymore." 
    ElseIf e.OldStart < Date.Today Then 
     If e.OldResource <> e.NewResource Then 
      message = "The room cannot be changed anymore." 
     Else 
      message = "The reservation start cannot be changed anymore." 
     End If 
    ElseIf e.NewStart < Date.Today Then 
     message = "The reservation cannot be moved to the past." 
    Else 
     dbUpdateEvent(id_Renamed, start, [end], resource) 
     'message = "Reservation moved."; 
    End If 

    LoadResourcesAndEvents() 
    DayPilotScheduler1.UpdateWithMessage(message) 
End Sub 

Private Sub dbUpdateEvent(ByVal id As String, ByVal start As Date, ByVal [end] As Date, ByVal resource As String) 
    Using con As New SqlConnection(ConfigurationManager.ConnectionStrings("connectionStringLocal").ConnectionString) 
     con.Open() 
     Dim numOfDay As Integer = CInt(([end] - start).TotalDays()) 


     Dim cmd As New SqlCommand("UPDATE [Reservation] SET ReservationStart = @start, ReservationEnd = @end, RoomId = @resource,[email protected] WHERE ReservationId = @id", con) 
     cmd.Parameters.AddWithValue("id", id) 
     cmd.Parameters.AddWithValue("start", start) 
     cmd.Parameters.AddWithValue("end", [end]) 
     cmd.Parameters.AddWithValue("resource", resource) 
     cmd.Parameters.Add("numofday", SqlDbType.Int).Value = numOfDay 
     cmd.ExecuteNonQuery() 
    End Using 
End Sub 

Screenshot von Datenbanktabellenstruktur:

enter image description here

Antwort

0
Math.floor(Math.abs(new Date(timestringone) - new Date(timestringtwo))/(1000*60*60*24)) 

einfach die Daten subtrahieren gibt die Zeit in Millisekunden dazwischen ihnen. Wenn das erste Mal vor dem zweiten Mal war, ist der Wert negativ, also habe ich Math.abs benutzt, um es absolut zu machen. Dann teilen wir 1000Milliseconds = 1 Sekunde, 60 Sekunden = 1 Minute, 60 Minuten = 1 Stunde, 24 Stunden = 1 Tag und Boden es zu ganzen Tagen Trog. Erfordert zwei gültige Timestrings (Timestringone und Timestringtwo).

Dies ist eine Javascript-Lösung als youve den js Tag enthielt ...

0

ich über die VB.Net bin nicht sicher, aber man kann es leicht in C# erreichte ein Objekt des Typs „Timespan“ verwenden. Nehmen wir zum Beispiel an, dass wir die Anzahl der Tage zwischen Anfang und Ende wissen möchten. Werte für den Datetime-Typen und zeigen es in einem Konsolenfenster, dann so etwas wie ich schreiben kann:

DateTime start=DateTime.MinValue; 
DateTime end=DateTime.MaxValue; 
TimeSpan span=end-start; 
Console.WriteLine("There're {0} days between {1} and {2}" , span.TotalDays, start.ToString(), end.ToString()); 
0

OP Probleme mit der .Days Eigenschaft auf der TimeSpan Struktur. Ich denke, das helfen kann:

Dim numOfDay As Integer = CInt(([end] - start).TotalDays()) 

Die Ausgabe lautet:

365 

auf die Verwendung Ihrer Parameter bewegen, ich glaube, Sie verwenden .Add und die Angabe des Datentyps profitieren würden:

cmd.Parameters.Add("@id", SqlDbType.Int).Value = id 
cmd.Parameters.Add("@start", SqlDbType.Date).Value = start 
cmd.Parameters.Add("@end", SqlDbType.Date).Value = [end] 
cmd.Parameters.Add("@resource", SqlDbType.Int).Value = CInt(resource) 
cmd.Parameters.Add("@numofday", SqlDbType.Int).Value = numOfDay 

Beachten Sie, dass Sie möglicherweise die SqlDbType ändern müssen. Ich habe eine Vermutung angenommen.

Ich würde auch umzusetzen Using sowohl für die SqlConnection und SqlCommand. Dies ist für mich nur eine gute Übung und der Code liest besser. Ich würde auch die .Add Überlastung für alle Parameter verwenden.

Using con As New SqlConnection(ConfigurationManager.ConnectionStrings("connectionStringLocal").ConnectionString), 
     cmd As New SqlCommand("UPDATE [Reservation] SET ReservationStart = @start, ReservationEnd = @end, RoomId = @resource, numofday = @numofday WHERE ReservationId = @id", con) 

    con.Open() 

    cmd.Parameters.Add("@id", SqlDbType.Int).Value = id 
    cmd.Parameters.Add("@start", SqlDbType.Date).Value = start 
    cmd.Parameters.Add("@end", SqlDbType.Date).Value = [end] 
    cmd.Parameters.Add("@resource", SqlDbType.Int).Value = CInt(resource) 
    cmd.Parameters.Add("@numofday", SqlDbType.Int).Value = CInt(([end] - start).TotalDays()) 

    Dim rowsAffected As Integer = cmd.ExecuteNonQuery() 
    If rowsAffected = 0 Then 
     'nothing updated 
    Else 
     'something updated 
    End If 

End Using 
Verwandte Themen