php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.09.2011, 08:39  
Benutzer
 
Registriert seit: 19.03.2009
Beiträge: 32
watchdogg befindet sich auf einem aufstrebenden Ast
Standard Zeiterfassung und monatliche Auswertung

Hallo Leute,

ich habe eine MySQL Datenbank, die in etwa Folgends beinhaltet:

In einer Tabelle ZEIT werden An- und Abmeldezeiten von Usern gespeichert.

In einer anderen Tabelle, nennen wir sie mal AKTION, werden vorgenomme Aktionen von Benutzern gespeichert.
Diese Tabelle enthält Informationen über die Aktionen, und zu welcher Zeit sie ausgeführt wurden.

Es gibt also in beiden Tabellen, Spalten mit Datum(Datentyp Date) und Zeit(Datentyp TIME).

In der Tabelle ZEIT gibt es die Spalte Benutzer, in der Tabelle Aktion jedoch nicht.

Mein Ziel ist es jetzt, die Aktionen aus der Tabelle AKTION den jeweiligen Benutzern zuzuweisen. Es muss also das Datum und die Zeit der Aktion mit der Anmeldezeit überprüft werden.
Der Benutzer, der zur Zeit der AKTION angemeldet war, bekommt die Aktion also zugewiesen.

Jetzt ist es aber so, das der Benutzer sich mehrmals täglich an- und abmelden kann, sodass sich für jeden Benutzer mehrere Zeitfenster ergeben.

Als erstes müssten ja die Zeitfenster ermittelt werden:

SELECT * FROM ZEIT WHERE user='benutzername' and art='Anmeldung'
sowie
SELECT * FROM ZEIT WHERE user='benutzername' and art='Abmeldung'

So jetzt hätte ich jeweils die An- und Abmeldezeiten. Da es mehrere An- und Abmeldungen gibt muss ich die Zeiten ja irgendwie speichern, oder?
Würdet ihr hier ein Array nehmen?

Im nächsten Schritt müssen die gespeicherten Zeitfensten nun mit der Tabelle AKTION verglichen werden.

SELECT * FROM AKTION WHERE Datum='gespeichertesDatum' AND Zeit BETWEEN 'gespeicherteStartzeit' AND 'gespeicherteEndzeit'

Und das für alle Einträge im Array.


Die Tabellenstrukturen sind festgelegt und können nicht verändert werden.
Ziel der ganzen Aktion soll eine Monatsauswertung sein.


Habt ihr eventuell TIPPS für mich, wie ich das sauber und effektiv realisieren kann?


MfG watchdogg
watchdogg ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 12.09.2011, 14:09  
Benutzer
 
Registriert seit: 19.03.2009
Beiträge: 32
watchdogg befindet sich auf einem aufstrebenden Ast
Standard

Hat keiner ne Idee, oder liegts an meiner Beschreibung?
watchdogg ist offline   Mit Zitat antworten
Alt 12.09.2011, 14:25  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Ja: Das Datenmodell ist be..scheiden.

Zitat:
Die Tabellenstrukturen sind festgelegt und können nicht verändert werden.
Zitat:
Habt ihr eventuell TIPPS für mich, wie ich das sauber und effektiv realisieren kann?
Unter diesen Voraussetzungen leider nicht.

Mein Vorschlag wäre gewesen, eine vernünftige Tabellenstruktur zu erstellen, in etwa so:

Tabelle "Benutzer"
ID | Name

Tabelle "Aktion"
ID | Benutzer_ID | Art_der_Aktion | von | bis

- Direkte Verbindung von Aktion zu Benutzer (über Fremdschlüssel)
- Komponente "Zeit" in Aktion verlagern, weg vom Benutzer
- Pro Aktion ein Eintrag in Tabelle "Aktion".

(Beitrag auf die Schnelle erstellt)
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 12.09.2011, 15:32  
Benutzer
 
Registriert seit: 19.03.2009
Beiträge: 32
watchdogg befindet sich auf einem aufstrebenden Ast
Standard

Ich habe in meinem ersten Beitrag völligen Blödsinn geschrieben.
So passierts eben, wenn man rumdöst - also nochmal.


Ich habe folgende Tabellen:


Tabelle USER
------------
UserID | UserName


Tabelle USERLOG
---------------
UserlogID | UserlogDate | UserlogStartTime | FK_User_ID | UserlogArt


In der Tabelle Userlog werden die Anmeldezeit und die Abmeldezeit gespeichert.
Jede Anmeldung und jede Abmeldung ist ein eigener Userlog für sich, es wird immer nur die Zeit des Userlogs gespeichert.

Also z.B.:

1 | 2011-09-06 | 12:00:00 | 4 | Anmeldung
2 | 2011-09-06 | 12:30:00 | 4 | Abmeldung
3 | 2011-09-06 | 13:00:00 | 1 | Anmeldung
4 | 2011-09-06 | 13:10:00 | 1 | Abmeldung
5 | 2011-09-06 | 14:00:00 | 4 | Anmeldung
6 | 2011-09-06 | 14:30:00 | 4 | Abmeldung
...


Jetzt kommt meine dritte Tabelle ins Spiel:

Tabelle AKTION
--------------

AktionID | AktionDate | AktionStartTime | AktionWert

1 | 2011-09-06 | 12:05:12 | 1200
2 | 2011-09-06 | 12:13:44 | 3000
3 | 2011-09-06 | 13:04:18 | 1444
4 | 2011-09-06 | 14:15:22 | 400

...


Ich möchte nun gerne eine Monatsabrechnung erstellen.
Man gibt also einen Usernamen, einen Monat und das Jahr ein.

Anhand der Zeiträume der Tabelle USERLOG sollen nun die Aktionen ermittelt werden, die in die Zeiträume für die jeweilige UserID zwischen An- und Abmeldung fallen.
Die Werte in AktionWert sollen addiert werden.

Beispiel:
---------

User 4 bekommt die AktionsWerte 4600, User1 bekommt 1444 zugewiesen.


Wie erstelle ich nun die Abfrage?
Ich muss doch erstmal prüfen in welchen Zeiträumen User 4 angemeldet war und dann die zugehörigen Aktionen selektieren, die in diese Zeiträume fallen.
Dazu muss ich ja die einzelnen Zeiträume zwischenspeichern.

Wie geht man dabei am Besten vor? Es wäre echt gut wenn ihr mir TIPPs dazu geben könntet.

Ich hoffe, dass meine Beschreibung verständlich ist.


MfG watchdogg
watchdogg ist offline   Mit Zitat antworten
Alt 12.09.2011, 15:58  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.833
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

Hi.

Entweder ist deine BEschreibung fehlerhaft, oder ich sehe den Wald vor lauter Bäume nicht, aber

Zitat:
User 4 bekommt die AktionsWerte 4600, User1 bekommt 1444 zugewiesen.
wo kommen die Werte den genau her?? In deiner Beispieltabelle stehen doch andere (Verwirrung). Ansonsten kannst du alles über eine SQL Abfrage doch machen.

mfg Wolf29
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline   Mit Zitat antworten
Alt 12.09.2011, 16:01  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Trenne Datum und Uhrzeit NICHT voneinander, sondern benutz DATETIME. Es macht das Rechnen mit Zeiten wesentlich einfacher, vor allem wenn An- und Abmeldung über eine Tagesgrenze hinweggehen.

Zitat:
Ich muss doch erstmal prüfen in welchen Zeiträumen User 4 angemeldet war und dann die zugehörigen Aktionen selektieren, die in diese Zeiträume fallen.
Dazu muss ich ja die einzelnen Zeiträume zwischenspeichern.

Wie geht man dabei am Besten vor? Es wäre echt gut wenn ihr mir TIPPs dazu geben könntet.
Sehe ich genauso. Mit nur einer Query ist das nicht zu erreichen.

Zitat:
Anhand der Zeiträume der Tabelle USERLOG sollen nun die Aktionen ermittelt werden, die in die Zeiträume für die jeweilige UserID zwischen An- und Abmeldung fallen.
Die Werte in AktionWert sollen addiert werden.
Als erstes musst du die einzelnen Zeiträume bestimmen, das wird mit reinem SQL nicht ganz leicht werden, weil du immer nur die zueinander passenden An- und Abmeldungen betrachten darfst. Der erste Datensatz muss eine Anmeldung sein, der Startzeitpunkt UND der Endzeitpunkt (d.h. der passende Abmelde-Datensatz) muss innerhalb des Betrachtungszeitraums liegen.

Die Bedingungen für die zweite Query werden aus den Daten der ersten Query (Bestimmung der Zeiträume für den User) zusammenschustern und mit OR verknüpfen:
Code:
SELECT 
  SUM(AktionWert) 
FROM
  Aktion
WHERE 
  AktionsDatum BETWEEN Zeitraum1.Start AND Zeitraum1.Ende
OR
  AktionsDatum BETWEEN Zeitraum2.Start AND Zeitraum2.Ende
...
Zeitraum1, Zeitraum2 bezeichnet ein passendes Wertepaar aus der ersten Abfrage (Start=Anmeldung, Ende=Abmeldung)
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 12.09.2011, 16:05  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Zitat:
Zitat von wolf29 Beitrag anzeigen
Hi.

Entweder ist deine BEschreibung fehlerhaft, oder ich sehe den Wald vor lauter Bäume nicht, aber



wo kommen die Werte den genau her?? In deiner Beispieltabelle stehen doch andere (Verwirrung). Ansonsten kannst du alles über eine SQL Abfrage doch machen.

mfg Wolf29
User 4:
1 | 2011-09-06 | 12:00:00 | 4 | Anmeldung
2 | 2011-09-06 | 12:30:00 | 4 | Abmeldung

5 | 2011-09-06 | 14:00:00 | 4 | Anmeldung
6 | 2011-09-06 | 14:30:00 | 4 | Abmeldung

User 4 war angemeldet am 06.09.2011 zwischen 12:00-12:30 und zwischen 14:00-14:30

Folgende Aktionen waren in den beiden Zeiträumen "aktiv":
1 | 2011-09-06 | 12:05:12 | 1200
2 | 2011-09-06 | 12:13:44 | 3000
4 | 2011-09-06 | 14:15:22 | 400

Die Punkte zusammengezählt: 4600

edit: Betrachtungszeitrum ist der 06.09.2011 (von 0 bis 23:59Uhr)
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 12.09.2011, 16:16  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.856
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Spar dir die 2 Spalten für Datum und Zeit und nutze eine die einen Timestamp ( Unix oder DateTime ) speichert.

Code:
SELECT a, b, c, timestamp FROM world WHERE timestamp BETWEEN CAST('2011-01-01' AS DATE) AND CAST('2011-01-01' AS DATE);
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 12.09.2011, 16:23  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.833
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

@lstegelitz: thanx...manchmal ist man einfach blind
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline   Mit Zitat antworten
Alt 13.09.2011, 07:20  
Benutzer
 
Registriert seit: 19.03.2009
Beiträge: 32
watchdogg befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für eure Antworten.
Wie gesagt die Spalten mit Datum und Zeit sind vorgegeben, ich kann die nicht einfach ändern.

Kann man die Spalten Datum und Zeit nicht irgendwie bei einer Abfrage in ein DATETIME Format casten?

MfG watchdogg
watchdogg ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
(S) All-In-One Tool für Freiberufler (Rechnung, Zeiterfassung und Kundenverwaltung) nicbec Off-Topic Diskussionen 12 31.08.2011 17:06
Fehler bei Auswertung eines Formulars bidu2004 PHP Tipps 2010 10 25.04.2010 21:17
Formular und Auswertung in einem php-Dokument Paeisi PHP Tipps 2009 17 28.11.2009 15:07
Scriptsuche Persönlichkeitstest mit Auswertung in PHP Dicke-Freunde Scriptbörse 2 20.08.2009 19:46
Auswertung erstellen rezix PHP Tipps 2008 5 15.02.2008 17:58
Auswertung von Veranstaltungstabelle maeck PHP Tipps 2006 10 01.11.2006 23:39
[Erledigt] Auswertung von Funktionen innerhalb von Strings PHP Tipps 2006 5 30.01.2006 14:03
Auswertung einer Pulldownmenus PHP Tipps 2005-2 2 23.10.2005 12:47
Auswertung Server, Hosting und Workstations 4 23.07.2005 15:11
Auswertung von Multiple Select-Listen PHP Tipps 2005-2 4 11.07.2005 17:52
[Erledigt] Auswertung und Uebertragung von Werten in Links PHP Tipps 2005-2 0 15.06.2005 12:12
[Erledigt] Auswertung von Mehrfachauswahllisten Datenbanken 25 26.05.2005 15:12
Auswertung mit globalen Variablen duerov PHP Tipps 2004 4 07.09.2004 14:23
checkbox auswertung PHP Tipps 2004 1 31.08.2004 21:08

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php zeiterfassung, arbeitszeiterfassung php, zeiterfassung php, php arbeitszeiterfassung, php mysql zeiterfassung, auswertung zeiterfassung, zeiterfassung php script, tabelle zeiterfassung, php script zeiterfassung, zeiterfassung auswertung, zeiterfassung php mysql, zeiterfassung mit sql datenbank aufbau tabellen, mysql zeiterfassung, datenbank für zeiterfassung, php monatliche auswertung, zeiterfassung per php, php mysql stempeluhr, php zeitabrechnung, php stempeluhr datumsfunktion, auswertung der zeiterfassung

Alle Zeitangaben in WEZ +2. Es ist jetzt 14:14 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum