DateTimePicker c# Tage berechnen

Zvoni

Erfahrenes Mitglied
Entweder Spykes Lösung (und "geht nicht" ist keine Fehlermeldung, hier dann weiter forschen, warum es nicht geht), oder meine "Krücken"-Lösung (entweder über ticks-Eigenschaft) oder hart in Integer bzw. Double casten, und voneinander subtrahieren.

Ich kann mir nicht vorstellen, dass eine "moderne" Sprache wie C# gegenüber vb6/vba so im Nachteil wäre.
In dem einen Link den ich eingehängt habe wird sogar erwähnt den VB.NET-Namespace einzubinden, und deren DateDiff-Funktion zu benutzen

EDIT: Hier ein Beispiel in VBA
Ich habe absichtlich ein Schaltjahr genommen, damit du siehst, dass SchaltJahr automatisch berücksichtigt wird.
Visual Basic:
Sub Irgendwas()
Dim StartDate As Date
Dim EndDate As Date
    StartDate = CDate("28.02.2020")
    EndDate = CDate("01.03.2020")
    Debug.Print "StartDate: " & CLng(StartDate)
    Debug.Print "EndDate: " & CLng(EndDate)
    Debug.Print "DateDiff-Funktion: " & DateDiff("d", StartDate, EndDate)
    Debug.Print "Subtraktion: " & CLng(EndDate) - CLng(StartDate)
End Sub

Ergibt:
Code:
StartDate: 43889
EndDate: 43891
DateDiff-Funktion: 2
Subtraktion: 2

EDIT2: Falls du es warum auch immer auf deine Art lösen willst:
Hiermit kannst du herausfinden, ob ein Jahr ein Schaltjahr ist
DateTime.IsLeapYear() Method in C#
 
Zuletzt bearbeitet:

werner_sg

Erfahrenes Mitglied
Entweder Spykes Lösung (und "geht nicht" ist keine Fehlermeldung, hier dann weiter forschen, warum es nicht geht), oder meine "Krücken"-Lösung (entweder über ticks-Eigenschaft) oder hart in Integer bzw. Double casten, und voneinander subtrahieren.

Ich kann mir nicht vorstellen, dass eine "moderne" Sprache wie C# gegenüber vb6/vba so im Nachteil wäre.
In dem einen Link den ich eingehängt habe wird sogar erwähnt den VB.NET-Namespace einzubinden, und deren DateDiff-Funktion zu benutzen

EDIT: Hier ein Beispiel in VBA
Ich habe absichtlich ein Schaltjahr genommen, damit du siehst, dass SchaltJahr automatisch berücksichtigt wird.
Visual Basic:
Sub Irgendwas()
Dim StartDate As Date
Dim EndDate As Date
    StartDate = CDate("28.02.2020")
    EndDate = CDate("01.03.2020")
    Debug.Print "StartDate: " & CLng(StartDate)
    Debug.Print "EndDate: " & CLng(EndDate)
    Debug.Print "DateDiff-Funktion: " & DateDiff("d", StartDate, EndDate)
    Debug.Print "Subtraktion: " & CLng(EndDate) - CLng(StartDate)
End Sub

Ergibt:
Code:
StartDate: 43889
EndDate: 43891
DateDiff-Funktion: 2
Subtraktion: 2

EDIT2: Falls du es warum auch immer auf deine Art lösen willst:
Hiermit kannst du herausfinden, ob ein Jahr ein Schaltjahr ist
DateTime.IsLeapYear() Method in C#
Alle Lösungen funktionierten leider nur innerhalb eines Jahres, also wenn das Anfangsdatum im Jahr 2020 liegt und das Enddatum ebenfalls in 2020 liegt, Probleme gibt es erst wenn der Anfang in 2020 liegt und das Ende in 2021.

Daher habe ich dann solange gesucht und zusammengestellt bis es zumindest ausgenommen der Schaltjahre läuft wobei es immer nur bei Situationen von unterschiedlichem Jahr im Anfang und Ende liegt.

Wobei es aber auch nur von dem Schaltjahr im Anfangsdatum abhängt

Ich werde einfach mal nach deinem Link den ersten TimePicker auf ein Schatjahr prüfen und wenn es eins ist einfach wieder einen Tag der ja dann in der Berechnung zuviel ist wieder abziehen

Also Danke für den Hinweis

Vieleicht kannst du mich aber auch direkt schon mal beim nächsten Punkt in die richtige richtung stoßen

alle Einträge einer Spalte der Tabelle sind über eine TextBox auswählbar, ich möchte aber das alle Einträge vom Datum des ersten TimePickers bis zum Datum des zweiten TimePickers nicht mit angezeigt werden.

mein bisheriger Code dazu

Die Bereitstellung der Daten

C#:
        Try
            dbcmd = New OleDbCommand("SELECT * FROM tblfahrzeuge", conn)
            Dim DbReader As OleDbDataReader

            DbReader = dbcmd.ExecuteReader
            While DbReader.Read
                CboxFahrzeug.Items.Add(DbReader("KFZ_NAME").ToString)
            End While
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

Die passende Checkbox dazu

C#:
    Private Sub Cboxcarname_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CboxFahrzeug.SelectedIndexChanged
        conn.Open()

        Try
            dbcmd = New OleDbCommand("SELECT * FROM tblfahrzeuge WHERE KFZ_NAME ='" & CboxFahrzeug.Text & "'", conn)
            Dim DbReader As OleDbDataReader

            DbReader = dbcmd.ExecuteReader
            While DbReader.Read
                Txtfahrzeugkennzeichen.Text = DbReader("KFZ_KENNZEICHEN")
                TxtTagesmiete.Text = DbReader("MIETE_PRO_TAG")
                TxtFahrzeugNummer.Text = DbReader("KFZ_ID")
                Txtkilometer.Text = DbReader("KFZ_KILOMETER")
                TxtTankinhalt.Text = DbReader("KFZ_TANK")
                TxtStandort.Text = DbReader("KFZ_STANDORT")

            End While
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try


        conn.Close()
    End Sub

Die Select Anweisung müsste irgendwie wie folgt aussehen

Code:
dbcmd = New OleDbCommand("SELECT * FROM tblfahrzeuge WHERE KFZ_NAME ='" & CboxFahrzeug.Text & "'" AND NOT zwischen Picker1 und Picker3", conn)
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Such mal nach SQL NOT BETWEEN
btw: Einen SQL-String wie oben zusammenzubauen ist "bad practice".
Lieber Parameter benutzen, in welchem Falle du dann auch den ganzen Schmarrn mit Anführungszeichen für Strings usw. komplett weglassen kannst, weil es die Engine für dich dann macht.
Wie gesagt: Bin kein .NET-ler, aber ich glaube mich daran zu erinnern, dass sowas wie StringBuilder angeboten wird in .NET
 

werner_sg

Erfahrenes Mitglied
C#:
    Private Sub DateTimePicker3_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DateTimePicker3.ValueChanged
        Dim days As New Integer
        Dim days2 As New Integer
        Dim days3 As New Integer
        Dim JahresZahl As New Integer

        days = DateTimePicker3.Value.DayOfYear - DateTimePicker1.Value.DayOfYear
        days2 = DateTimePicker1.Value.DayOfYear
        days3 = DateTimePicker3.Value.DayOfYear
        JahresZahl = DateTimePicker1.Value.Year




        TxtAnzahlTage.Text = days.ToString()
        If Val(TxtAnzahlTage.Text) < 0 Then
            TxtAnzahlTage.Text = (365 - days2.ToString() + days3.ToString())
        End If

        Try

            If (JahresZahl / 4 = 0 & JahresZahl / 100 = 0) Then     ' prüft auf Schaltjahr

                TxtAnzahlTage.Text = (TxtAnzahlTage.Text + 1)        ' ist Schaltjahr wird ein Tag dazu gezählt


            End If

        Catch ex As Exception

        End Try

    End Sub

So klappt es einwandfrei, Danke an alle für die Mithilfe
 

werner_sg

Erfahrenes Mitglied
Such mal nach SQL NOT BETWEEN
btw: Einen SQL-String wie oben zusammenzubauen ist "bad practice".
Lieber Parameter benutzen, in welchem Falle du dann auch den ganzen Schmarrn mit Anführungszeichen für Strings usw. komplett weglassen kannst, weil es die Engine für dich dann macht.
Wie gesagt: Bin kein .NET-ler, aber ich glaube mich daran zu erinnern, dass sowas wie StringBuilder angeboten wird in .NET
Danke der Hinweis ist gut werde das mal angehen mit NOT BETWEEN

Das der Beispiel String für die Katz war ist mir klar, war nur zur vereinfachten Erklärung was ich suchte, BETWEEN hatte ich nicht auf dem Schirm, braucht man ja auch wirklich nur sehr selten (ich zumindest)
 

Spyke

Premium-User
Ich kann mir nicht vorstellen, dass eine "moderne" Sprache wie C# gegenüber vb6/vba so im Nachteil wäre.
In dem einen Link den ich eingehängt habe wird sogar erwähnt den VB.NET-Namespace einzubinden, und deren DateDiff-Funktion zu benutzen

Geht unter C# auch relativ einfach, was mich hier verwundert.
Hier wird ja mit VB.Net programmiert.

Das es anscheinend unter VB.Net geht einen int Wert mit einem string zu subtrahieren.
Code:
TxtAnzahlTage.Text = (365 - days2.ToString() + days3.ToString())
unter C# geht sowas nicht, da meckert das direkt der Compiler an
da müsst man sowas z.B. schreiben
Code:
TxtAnzahlTage.Text = (365 - days2 + days3).ToString()

Vielleicht gibts für VB.Net Einschränkungen das es da mit TimeSpan nicht funktioniert, gibt ja nicht umsonst den VisualBasic namespace
 

Neue Beiträge