Datetime Datacolumn ohne Datum

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von schnibli.

    Datetime Datacolumn ohne Datum

    Hallo Zusammen,

    Ich würde gerne mit Zeit rechnen:
    Arbeitsende-pause-Beginn = Total Stunden

    Ich habe die spalten Arbeitsende, pause und Beginn in Datetime formatiert, hier würde ich gerne die spalten so anpassen das nur das Datum gespeichert wird. Ist dies möglich?
    Die Spalte Total_Stunden habe ich als Timespan.


    Die Daten werden in einer ACCESS DB gespeichert.
    Währe um jede Hilfe Dankbar

    schnibli schrieb:

    ich gerne die spalten so anpassen das nur das Datum gespeichert wird
    Arbeitsende und Arbeitsbeginn sind wohl üblicherweise am selben Tag.
    Wenn du nur das Datum speicherst, verlierst du die wichtigste Information.

    schnibli schrieb:

    Die Spalte Total_Stunden habe ich als Timespan.
    Überprüfe dein Datenmodell.
    Total_Stunden sind aus den anderen drei Werten berechenbar und haben nichts in der Datenbank verloren.

    Mir scheint, du bringst GUI (Anzeige der Daten) und Datenmodell gehörig durcheinander.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod ganz deiner Meinung
    Es bring dir nichts, wenn du das Datum oder Uhrzeit nicht mit abspeicherst.
    Und es ist ja jetzt auch nicht so schlimm, wenn es in der Datenbank mit auftaucht.

    Hier mal ein kleines Beispiel:

    VB.NET-Quellcode

    1. Dim arbeit_anfang = DateTime.Now ' erste mal die Zeit abgreifen und in DB speichern "Anfang"
    2. Dim arbeit_ende = DateTime.Now.AddHours(8) ' zweite mal die Zeit abgreifen und in DB speichern "Ende" /// provisorisch mal +8h
    3. Dim dauer_anwesend As TimeSpan = (arbeit_ende - arbeit_anfang) ' Berechnung der Anwesenheitszeit wird nicht abgespeichert
    4. Dim pause_anfang = DateTime.Now ' erste mal die Zeit abgreifen und in DB speichern "Anfang"
    5. Dim pause_ende = DateTime.Now.AddMinutes(30) ' zweite mal die Zeit abgreifen und in DB speichern "Ende" /// provisorisch mal +30min
    6. Dim dauer_pause As TimeSpan = (pause_ende - pause_anfang) ' Berechnung der Pause wird nicht abgespeichert
    7. Dim arbeitszeit As TimeSpan = (dauer_anwesend - dauer_pause) ' Berechnung der reinen Arbeitszeit nicht abspeichern
    8. MsgBox(dauer_anwesend.ToString & vbNewLine & _
    9. dauer_pause.ToString & vbNewLine & _
    10. arbeitszeit.ToString)
    11. End Sub


    Und wenn du die Sachen wieder aus der Datenbank ausliest kannst du ja auch immer wieder jede Information abfragen,
    die du brauchst :

    VB.NET-Quellcode

    1. MsgBox(arbeit_anfang.Date) ' wenn du das Datum haben willst
    2. MsgBox(arbeit_anfang.TimeOfDay.ToString) 'wenn du die Zeit haben willst
    Keep Calm And Color Your Life
    Eine Zeiterfassung für Monteuere, die Tragen die Zeit erst am Abend ein daher ist es nicht nötig einen Anfang und ein Ende der Pause einzutragen.

    Ich möchte es so einfach wie möglich machen. Daher die Pause direkt eintragen.
    Ok.

    Na dann kannst du dir den Teil mit Pause Anfang und -Ende sparen und kannst die Zeit direkt eintragen.

    Hier mal ein Beispiel

    VB.NET-Quellcode

    1. Dim anfang As DateTime = New DateTime(2014, 6, 20, 8, 0, 0) ' Datum ist 20.6.2014 Uhrzeit ist 8:00:00
    2. Dim ende As DateTime = New DateTime(2014, 6, 20, 16, 30, 0) ' Datum ist 20.6.2014 Uhrzeit ist 16:30:00
    3. Dim dauer As TimeSpan = ende - anfang
    4. Dim pause As TimeSpan = New TimeSpan(0, 30, 0) ' Pause ist 30 Minuten
    5. MsgBox("Anwesenheitszeit: " & dauer.ToString & vbNewLine & _
    6. "Arbeitszeit: " & (dauer - pause).ToString)
    Keep Calm And Color Your Life
    Hallo,
    Vielen dank für deine bemühung. Leider habe ich folgendes Problem:

    VB.NET-Quellcode

    1. Dim anfang As DateTime = New DateTime(ArbeitsbeginnDateTimePicker.Text) ' Datum ist 20.6.2014 Uhrzeit ist 8:00:00
    2. Dim ende As DateTime = New DateTime(ArbeitsendeDateTimePicker.Text) ' Datum ist 20.6.2014 Uhrzeit ist 16:30:00
    3. Dim dauer As TimeSpan = ende - anfang
    4. Dim pause As TimeSpan = New TimeSpan(0, PauseDateTimePicker.Text, 0) ' Pause ist 30 Minuten
    5. MsgBox("Anwesenheitszeit: " & dauer.ToString & vbNewLine & _
    6. "Arbeitszeit: " & (dauer - pause).ToString)


    Wie du siehst Arbeite ich mit Datetimepicker mit dem Format hh:mm nun habe ich den Code so umgeschrieben wie oben.

    Folgender fehler
    Hallo, Danke.

    Dies habe ich nun angepasst aber den Fehler:
    Der Wert von typ "Date" kann nicht in "long" konvertiert werden.
    Erscheint auch bei:

    VB.NET-Quellcode

    1. Dim anfang As DateTime = New DateTime(ArbeitsbeginnDateTimePicker.Value) ' Datum ist 20.6.2014 Uhrzeit ist 8:00:00
    2. Dim ende As DateTime = New DateTime(ArbeitsendeDateTimePicker.Value) ' Datum ist 20.6.2014 Uhrzeit ist 16:30:00
    Vielen Dank für die erläuterung.
    Nun habe ich es auch begriffen :)

    Jetzt zum Resultat:
    Arbeitsbegin = Datetimepicker
    pause = NummericUpDown
    Arbeitsende = Datetimepicker

    Nun erhalte ich als ergebniss:


    Anwesenheitszeit 2.09:00:26
    Arbeitszeit 2.09:00:26
    Nun Brauche ich nur 9:00

    Die 2 und die 26 brauche ich nicht

    Die Frage ist auch nocht, wie muss ich das format in der DB festlegen für die NummericUpDown

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „schnibli“ ()

    Also,
    Formatierung im Dataset und in der Access Tabelle ist Datetime (gilt für anfang, pause und ende)

    Wenn ich 60 eintrage, gibt der in der msgbox von NumericUpDown1.Value auch 60 zurück.

    Ich muss Dazu sagen dass meine Datetimepicker wie folgt formatiert sind:


    VB.NET-Quellcode

    1. ArbeitsbeginnDateTimePicker.CustomFormat = "HH:mm tt"
    2. ArbeitsbeginnDateTimePicker.ShowUpDown = True


    Ich habe so das gefühl das meine Datetime mit dem NumericUpDown1 nicht zuschlage kommt da der eingabewert falsch ist wenn ich 60 eintrage.
    Das wirkt sich so aus, dass ich dass Feld nicht verlassen kann.
    Bilder
    • test.PNG

      7,15 kB, 474×186, 137 mal angesehen
    CustomFormat = hh:mm (die tt ... ?)
    Format = Custom
    Das hat aber für die Berechnung glaube keinen Einfluß...

    Pause ist ein TimeSpan - eine Zeitspanne zwischen 2 Zeitpunkten, wie Arbeitsbeginn und Arbeitsende.
    Das NummericUpDown gibt dir ein Decimal zurück, d.h. du musst für Pause

    VB.NET-Quellcode

    1. Dim pause As TimeSpan = New TimeSpan(0, CInt(nudPause.Value), 0)
    schreiben, wenn du nur die Minuten für die Pause angeben willst.
    In der DB speichert man die datengebundene NUD (Pause) natürlich im DatenTyp Decimal ab und nicht als DateTime!
    Das Speichern habe ich soeben gefixt.

    Jedoch zeigt er mir immernoch:
    5. 10:00:14 an
    Die "5." brauche ich nicht und weis nicht woher die kommt.
    Code:

    VB.NET-Quellcode

    1. Dim anfang As DateTime = (ArbeitsbeginnDateTimePicker.Value) ' Datum ist 20.6.2014 Uhrzeit ist 8:00:00
    2. Dim ende As DateTime = (ArbeitsendeDateTimePicker.Value) ' Datum ist 20.6.2014 Uhrzeit ist 16:30:00
    3. Dim dauer As TimeSpan = ende - anfang
    4. Dim pause As TimeSpan = New TimeSpan(0, CInt(nudPause.Value), 0)
    5. MsgBox("Anwesenheitszeit: " & dauer.ToString & vbNewLine & _
    6. "Arbeitszeit: " & (dauer - pause).ToString)



    Edit:

    Meinst du in der Access DB oder in VB? "DatenTyp Decimal"

    Ich komme nicht nach wo ich das einstellen kann.

    Lesefehler sorry hab es kappiert :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „schnibli“ ()