none
Zeit berechnen RRS feed

  • Frage

  • Hallo

    ich möchte gerne eine einfache Zeiterfassung berechnen.

    Bsp. Die Kollegin kommt morgens ins Büro und gibt 9:50 ein und wenn Sie wieder geht, gibt sie 12:10 in ein weiteres Feld ein. Jetzt möchte ich am Ende des Tages dann die Minuten Arbeitsszeit errechnen. Ich habe da noch ein extra Feld, wo ich das Datum hineinschreibe. Ich bin mir jetzt wirklich nicht sicher, wie ich das am besten lösen soll. Eine Berechnung mit Datediff() mit Datetime-Feldern ist kein Problem, aber wie mache ich dass, wenn ich den Zeitpunkt manuell einfügen will?

    Ich habe dann auch versucht, Datum und Zeitpunkt zu einem Datum zu montieren um die Werte später wieder voneinander abziehen zu können. Aber das funktioniert auch nicht.

     select *,CAST(datum+zeitAnfang as nvarchar) as dAnfang from Arbeitszeit

    Der Zeitpunkt hat das Feldformat time, ich bin mir nicht sicher, ob das richtig ist.

    Hat jemand bitte einen Tipp für mich?

    Ich habe heute schon so viel gesucht und getestet.

     

     

     


    Liebe Grüße, die Luzie!
    Freitag, 26. August 2011 16:41

Antworten

  • Hallo Luzie,
      
    ich würde eine Berechnete Spalte, wie in folgendem Beispiel, einsetzen:
    use tempdb
    go
    
    create table [dbo].[Task]
    (
    	TaskID int identity primary key not null,
    	WorkBreakdownStructureID int not null,
    	EmployeeID int not null,
    	TaskDate date not null, 
    	TaskStart time not null,
    	TaskStop time null,
    	TaskTime as (datediff(MINUTE,TaskStart,coalesce(TaskStop,TaskStart))),
    	Details nvarchar(255) null
    )
    go
    
    insert into dbo.Task
    (
    	WorkBreakdownStructureID,EmployeeID,
    	TaskDate,TaskStart,TaskStop,
    	Details
    )
    values
    (
    	1,1,
    	'2011-08-23','08:00:00',null,
    	'Implementierung des Zeiterfassungssystem'
    )
    go
    
    update dbo.Task
    set TaskStop = '12:30:00'
    where TaskID = 1 and EmployeeID = 1
    go
    
    insert into dbo.Task
    (
    	WorkBreakdownStructureID,EmployeeID,
    	TaskDate,TaskStart,TaskStop,
    	Details
    )
    values
    (
    	1,1,
    	'2011-08-23','13:00:00',null,
    	'Implementierung des Zeiterfassungssystem'
    )
    go
    
    update dbo.Task
    set TaskStop = '15:45:00'
    where TaskID = 2 and EmployeeID = 1
    go
    
    select
    	EmployeeID,
    	WorkBreakdownStructureID,
    	TaskDate,
    	cast(dateadd(minute,sum(TaskTime),'00:00:00') as time(0)) SumTaskTime
    from
    	dbo.Task
    where
    	TaskDate = '2011-08-23'
    group by
    	EmployeeID,
    	WorkBreakdownStructureID,
    	TaskDate
    go
    
    drop table dbo.Task
    go



    • Als Antwort markiert Luzie Samstag, 27. August 2011 17:50
    Freitag, 26. August 2011 19:01

Alle Antworten

  • Hallo Luzie,

    was meinst Du mit "den Zeitpunkt manuell einfügen"?

    Grundsätzlich läßt sich mit Time genauso rechnen wie mit datetime. 

    declare @von as time, @bis as time
    set @von = '9:50'
    set @bis = '12:10'
    select @von, @bis, datediff(MINUTE,@von,@bis)
    Aber persönlich würde ich ein Datetime bevorzugen. Falls mal Zeiten über Mitternacht hinaus eingefügt werden müßten, wäre das mit Time schwierig zu händeln. Alternativ würde ich ein berechnetes Feld in der Tabelle mitführen, daß die Minuten sofort ausrechnet.

    Freitag, 26. August 2011 18:40
  • Hallo Luzie,

    du schreibst:

    Ich habe dann auch versucht, Datum und Zeitpunkt zu einem Datum zu montieren um die Werte später wieder voneinander abziehen zu können. Aber das funktioniert auch nicht.

     select *,CAST(datum+zeitAnfang as nvarchar) as dAnfang from Arbeitszeit

    Wenn ich dies bei mir durchführe gibt es da keine Probleme:

    Declare 
    @startdate datetime,
    @enddate datetime
    SET @startdate = (SELECT CAST(datum+' '+zeitA as datetime) from Arbeitszeit)
    SET @enddate  = (SELECT CAST(datum+' '+zeitE as datetime) from Arbeitszeit)
    SELECT DATEDIFF (MINUTE , @startdate, @enddate)
    


    Gruß Falk
    Falk Krahl
    Freitag, 26. August 2011 18:58
  • Hallo Luzie,
      
    ich würde eine Berechnete Spalte, wie in folgendem Beispiel, einsetzen:
    use tempdb
    go
    
    create table [dbo].[Task]
    (
    	TaskID int identity primary key not null,
    	WorkBreakdownStructureID int not null,
    	EmployeeID int not null,
    	TaskDate date not null, 
    	TaskStart time not null,
    	TaskStop time null,
    	TaskTime as (datediff(MINUTE,TaskStart,coalesce(TaskStop,TaskStart))),
    	Details nvarchar(255) null
    )
    go
    
    insert into dbo.Task
    (
    	WorkBreakdownStructureID,EmployeeID,
    	TaskDate,TaskStart,TaskStop,
    	Details
    )
    values
    (
    	1,1,
    	'2011-08-23','08:00:00',null,
    	'Implementierung des Zeiterfassungssystem'
    )
    go
    
    update dbo.Task
    set TaskStop = '12:30:00'
    where TaskID = 1 and EmployeeID = 1
    go
    
    insert into dbo.Task
    (
    	WorkBreakdownStructureID,EmployeeID,
    	TaskDate,TaskStart,TaskStop,
    	Details
    )
    values
    (
    	1,1,
    	'2011-08-23','13:00:00',null,
    	'Implementierung des Zeiterfassungssystem'
    )
    go
    
    update dbo.Task
    set TaskStop = '15:45:00'
    where TaskID = 2 and EmployeeID = 1
    go
    
    select
    	EmployeeID,
    	WorkBreakdownStructureID,
    	TaskDate,
    	cast(dateadd(minute,sum(TaskTime),'00:00:00') as time(0)) SumTaskTime
    from
    	dbo.Task
    where
    	TaskDate = '2011-08-23'
    group by
    	EmployeeID,
    	WorkBreakdownStructureID,
    	TaskDate
    go
    
    drop table dbo.Task
    go



    • Als Antwort markiert Luzie Samstag, 27. August 2011 17:50
    Freitag, 26. August 2011 19:01
  • Hallo

    vielen Dank für die vielen Beispiele.

    Warum das jetzt bei mir nicht funktionierte mit dem Datediff und den Berechnungen, kann ich jetzt auch nicht mehr nachvollziehen.
    Also ich benötige einfach nur die Zeiten und das Datum, von daher reicht diese Berechnung auch aus. Es wird auch nie der Fall sein, dass wir die Tagesgrenze überschreiten.  Ich werde mal versuchen, das Beispiel von Yury umzusetzen. Es liefet mir direkt die korrekte Berechnung in Stunden und Minuten.

    Die Mitarbeiterinnen geben zu Beginn die Zeit ein und wenn sie wieder gehen, geben Sie die Endzeit ein. Sollten sie dies vergessen, werden sie beim nächsten Aufruf der Applikation daran erinnert.

    Vielen Dank nochmal an alle.
    Ihr habt mir wirklich sehr geholfen.
    Liebe Grüße, die Luzie!
    Samstag, 27. August 2011 17:50
  • Hallo Luzie,
    Die Mitarbeiterinnen geben zu Beginn die Zeit ein und wenn sie wieder gehen, geben Sie die Endzeit ein. Sollten sie dies vergessen, werden sie beim nächsten Aufruf der Applikation daran erinnert.

    was mir irgendwie nicht in den Kopf will: Warum in aller Welt sollen die die Uhrzeit händisch eingeben? Button-Klick, Anzeige der aktuellen Uhrzeit in einem passenden Control, ggfs. noch eine Korrekturmöglichkeit in Minutenschritten per NumericUpDown-Control und schon ist auch klar, dass da keine Fantasiezeit eingegeben wird.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 27. August 2011 18:22
    Moderator
  • Hallo Stefan,

    das ist grundsätzlich richtig, was Du sagst. Das Erinnern dient lediglich dazu, dass 2 Zeiten eingetragen werden müssen.

    Aber ich möchte unseren Mitarbeiterinnen einfach die Freiheit geben
    - auch nach einer Stunde und "ups, habe ich doch vergessen, meine Anfangszeit einzufügen" ein Eintragen der Zeit zu ermöglichen
    - oder z.B. am Ende des Arbeitstages die Zeiten eintragen
    - oder auch die Zeit vom Vortag nachzuholen
    - oder auch Zeiten nachträglich zu ändern.

    Diese Eintragungen dienen lediglich ihrer eigenen Kontrolle, nicht der Kontrolle durch das Unternehmen.
    Also, nur für unser Unternehmen bzw. unsere Mitarbeiter spezifisch. :)
    Liebe Grüße, die Luzie!


    Samstag, 27. August 2011 19:24