php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 17.02.2005, 13:46  
Gast
 
Beiträge: n/a
Standard Datumsabfrage + Uhrzeit

Hallo,

ich habe ein Problem mit meiner Datenbank. Ich habe eine Tabelle mit den Werten: Mitarbeiter_ID, Firma_ID, Anfangszeit, Endzeit, und Datum.

Jetzt liegt mein Problem darin, das ich keine Abfrage gefunden habe, die mir die Mitarbeiter_ID gibt, die an einem bestimmten Datum und Uhrzeit nicht belegt ist. Das heisst, das die Person am bestimmten Datum ein Eintrag haben darf aber halt nicht zu der Uhrzeit. Ich habe es mit einem Subquery versucht, aber wenn das Datum überhaupt noch nicht vergeben wurde, bekomme ich keinen Wert mehr aus der Datenbank (also NULL). Das würde eigentlich bedeuten, das dann alle mitarbeiter_id's genommen werden dürften, aber da ich ja keine abfrage!=Null machen darf komme ich nicht weiter.

Liegt das Problem schon daran, das ich das Datum in der gleichen Tabelle abspeicher (das selbe Datum kann öfters vorkommen), oder kann ich das anders lösen.

Viele Grüsse
Maik
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 17.02.2005, 14:57  
Gast
 
Beiträge: n/a
Standard

Teste folgende Abfrage:
Code:
SELECT
   a.Mitarbeiter_ID, a.Datum,
   b.Mitarbeiter_ID
FROM
   tabelle AS a
LEFT JOIN
   tabelle AS b
   ON (a.Mitarbeiter_ID = b.Mitarbeiter_ID)
   AND (('$bestimmteUhrzeit' BETWEEN a.Anfangszeit AND a.Endzeit)
       AND ('$bestimmtesDatum' = a.Datum))
WHERE
   b.Mitarbeiter_ID IS NULL
";
___________________
mfG -dilemma-
  Mit Zitat antworten
Alt 17.02.2005, 15:00  
Gast
 
Beiträge: n/a
Standard

Das hättest du auch kürzer fassen können, ich hab nur die Hälfte verstanden. Ein Beisipel wäre vorteilhaft. Welchen Datentyp haben denn die betroffenen Felder?
  Mit Zitat antworten
Alt 17.02.2005, 15:26  
Gast
 
Beiträge: n/a
Standard

Code:
CREATE TABLE belegung (
  ID int(100) NOT NULL auto_increment,
  mitarbeiter_ID int(100) NOT NULL default '0',
  firma_ID int(100) NOT NULL default '0',
  aufgaben_ID int(100) NOT NULL default '0',
  zeit_beginn time NOT NULL default '00:00:00',
  zeit_ende time NOT NULL default '00:00:00',
  datum date default NULL,
  PRIMARY KEY  (ID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Code:
SELECT mitarbeiter.ID, mitarbeiter.Nachname, mitarbeiter.Ort
		FROM mitarbeiter, firma, aufgaben, auftrag, qualifikation, dummy
		WHERE 
		firma.ID={$_SESSION['firmaauftrag']} and
		firma.ID=auftrag.firma_ID and
		qualifikation.aufgaben_ID={$_POST['Aufgabe']} and
		mitarbeiter.ID=qualifikation.mitarbeiter_ID and
		mitarbeiter.GuthabenStunden>=dummy.Zeitdiff and
		auftrag.erledigt=0 and
		mitarbeiter_ID != any (SELECT mitarbeiter_ID from belegung where datum=from_unixtime({$_POST['wochentag']}))
		group by mitarbeiter.ID
Jetzt soll eigentlich der Mitarbeiter rauskommen, der an diesem Tag noch nichts zu tun hat bzw. es fehlt noch die Abfrage nach der Uhrzeit, denn der Mitarbeiter darf am selben Tag arbeiten, aber nicht zur selben Zeit.

Diese Abfrage bereitet mir die Probleme
Code:
mitarbeiter_ID != any (SELECT mitarbeiter_ID from belegung datum=from_unixtime({$_POST['wochentag']}))
Wenn der Tag noch gar nicht vergeben worden ist, also z.B. ein Tag in ferner Zukunft, bekomme ich dort dann keinen Wert mehr und dann steht dort halt mitarbeiter_ID!=Null

Hoffe das ist jetzt verständlicher.

Thx für die Hilfe
Grüsse MAIK
  Mit Zitat antworten
Alt 17.02.2005, 16:14  
Gast
 
Beiträge: n/a
Standard

neuer Vorschlag:
Code:
SELECT
   mitarbeiter.ID, mitarbeiter.Nachname, mitarbeiter.Ort
FROM
   mitarbeiter, firma, aufgaben, auftrag, qualifikation, dummy

LEFT JOIN belegung
     ON  mitarbeiter.ID = belegung.mitarbeiter_ID
     AND
     belegung.datum = from_unixtime({$_POST['wochentag']})
     AND
     belegung.zeit_beginn BETWEEN '08:00:00' AND '12:00:00'  /* !!! */
     AND
     belegung.zeit_ende   BETWEEN '08:00:00' AND '12:00:00'  /* !!! */

WHERE
   firma.ID={$_SESSION['firmaauftrag']} and
   firma.ID=auftrag.firma_ID and
   qualifikation.aufgaben_ID={$_POST['Aufgabe']} and
   mitarbeiter.ID=qualifikation.mitarbeiter_ID and
   mitarbeiter.GuthabenStunden>=dummy.Zeitdiff and
   auftrag.erledigt=0
   AND belegung.mitarbeiter_ID IS NULL  /* !!! */
mfG -dilemma-
  Mit Zitat antworten
Alt 17.02.2005, 17:02  
Gast
 
Beiträge: n/a
Standard

Hi -dilemma-

vielen Dank für deine Hilfe. Die Anfrage ist super! Jetzt funktioniert es!! Ein Harken hat aber die Sache noch

Hast du Zeit und Lust mir das ganze zu erklären. Irgendwie verstehe ich die Left Join Befehle nicht so ganz. Also jetzt nicht nur in diesem Beispiel sondern allgemein.

Code:
LEFT JOIN belegung 
     ON  mitarbeiter.ID = belegung.mitarbeiter_ID 
     AND 
     belegung.datum = '2005-02-05'
     AND 
     belegung.zeit_beginn BETWEEN '06:00:00' AND '12:00:00'  /* !!! */ 
     AND 
     belegung.zeit_ende   BETWEEN '06:00:00' AND '12:00:00'  /* !!! */
Code:
AND belegung.mitarbeiter_ID IS NULL
Habe in der SQL - Hilfe zwar sachen gefunden, aber das auch umzusetzen bereitet mir echte Probleme.

Ansonsten Hut ab! Du hast mir viel viel Zeit (Ärger) erspart. Vielen Dank
  Mit Zitat antworten
Alt 17.02.2005, 17:43  
Gast
 
Beiträge: n/a
Standard

Versuch einer Erklärung (ist nicht meine Stärke).
[aus der MYSQL-Docu:]
Der ON-Bedingungscode ist jeglicher Bedingungscode der Form,
wie er auch in einer WHERE-Klausel benutzt werden kann.
Wenn es für die rechte Tabelle KEINEN übereinstimmenden Datensatz
im ON-Teil eines LEFT JOIN gibt,
wird für die rechte Tabelle eine Zeile benutzt, in der alle Spalten auf NULL gesetzt sind.
Das können Sie benutzen, um Datensätze in einer Tabelle herauszusuchen,
die in einer anderen Tabelle kein Gegenstück haben...
[code]
WHERE ...
AND belegung.mitarbeiter_ID IS NULL /* !!! */
[/CODEE]
Weil ja entsprechend folgender ON-Condition:
Code:
LEFT JOIN belegung
     ON  mitarbeiter.ID = belegung.mitarbeiter_ID
     AND
     belegung.datum = '2005-02-05'
     AND
     belegung.zeit_beginn BETWEEN '06:00:00' AND '12:00:00'  /* !!! */
     AND
     belegung.zeit_ende   BETWEEN '06:00:00' AND '12:00:00'  /* !!! */
===> belegung.mitarbeiter_ID auf NULL gesetzt wird,

wenn die ON-Conditions NICHT übereinstimmen bzw. zutreffend sind:


--> Optimale Erklärung bzgl. JOINs hier:
--> http://v.hdm-stuttgart.de/~riekert/l....htm#Chap7.2.6

mfG -dilemma-
  Mit Zitat antworten
Alt 17.02.2005, 18:40  
Gast
 
Beiträge: n/a
Standard

yo dilemma,

ich versuche es mal zu verinnerlichen :wink:

Aber eine letzte Frage hätte ich da noch. Wie kann ich nun auf die zweite Uhrzeit, eine Stunde aufaddieren.

Habe es so versucht, und es hat wie immer nicht geklappt

Code:
AND 
     	belegung.zeit_beginn BETWEEN '07:00:00' AND 'ADDTIME('07:00:00', '01:00:00')'
     	AND 
     	belegung.zeit_ende   BETWEEN '08:00:00' AND 'ADDTIME('08:00:00', '01:00:00')
So funkt es:
Code:
select ADDTIME('07:00:00', '01:00:00')
-> 08:00:00
Hast du da vielleicht auch ne Idee

grüsse
  Mit Zitat antworten
Alt 17.02.2005, 19:54  
Gast
 
Beiträge: n/a
Standard

Ja, OHNE diese 'Singlequotes' um die Funktion 'ADDTIME(...)' herum!
Außerdem glaube ich, daß folgende Formuliereung vielleicht sinnvoller wäre:
Code:
AND (
      belegung.zeit_beginn BETWEEN '07:00:00' AND ADDTIME('07:00:00', '01:00:00')
      OR
      belegung.zeit_ende   BETWEEN '08:00:00' AND ADDTIME('08:00:00', '01:00:00')
    )
mfG -dilemma-
  Mit Zitat antworten
Alt 18.02.2005, 17:49  
Gast
 
Beiträge: n/a
Standard

Nachtrag / Korrektur:

Mögliche Variationen für TerminÜberschneidungen:

B = Beginn eines bereits festgelegten Termins,
E = Ende eines bereits festgelegten Termins,

A = Beginn einens neu festzulegenden Termins,
Z = Ende einens neu festzulegenden Termins.
Code:
-----------------------------------------------------------------
...........B************E............ bereits festgelegter Termin
...A=======Z............^............ T1
...A=======^=====Z......^............ T2
...A=======^============Z............ T3
...A=======^============^========Z... T4
...........A============Z............ T5
...........A============^========Z... T6
...........^..A=====Z...^............ T7
...........^.....A======^========Z... T8
...........^............A========Z... T9

-----------------------------------------------------------------
MYSQL-mäßig ausgedrückt ergeben sich TerminÜberschneidungen,
wenn folgende Formulierung wahr ist:
-----------------------------------------------------------------
ON
(
   (B between A and Z)    /* für T1 bis T6  */
   OR
   (A betwenn B and E)    /* für T5 bis T9  */
)
-----------------------------------------------------------------
_____________
mfG -dilemma-
  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
Datum & Uhrzeit ausgeben Spacefish PHP-Fortgeschrittene 15 15.12.2007 10:18
Uhrzeit Java Script mar8125 HTML, Usability und Barrierefreiheit 5 28.06.2007 00:55
Mail zu einer bestimmten Uhrzeit schicken obi PHP Tipps 2006 2 26.09.2006 16:05
Uhrzeit verstellen. Chrescht PHP Tipps 2007 3 06.12.2005 15:25
uhrzeit PHP Tipps 2005-2 29 29.08.2005 19:29
Prüfung auf Datum und Uhrzeit PHP Tipps 2005-2 5 22.08.2005 10:39
Probleme beim Uhrzeit aus MDB auslesen PHP Tipps 2005-2 3 16.08.2005 14:19
Ordnen nach der Uhrzeit PHP Tipps 2005-2 7 03.08.2005 15:31
Uhrzeit in function date_german2mysql($rk_datum) PHP Tipps 2005-2 9 25.07.2005 21:03
microtime in Datum + Uhrzeit verwandeln und anders rum PHP Tipps 2005 6 27.04.2005 13:42
Datum Uhrzeit PHP Tipps 2005 17 21.04.2005 17:02
Cokkie setzen bis zum Datum xx.xx.xxxx und uhrzeit xx.xx Blank PHP Tipps 2005 9 28.03.2005 17:06
In GIF-Datei Datum und Uhrzeit ausgeben? PHP Tipps 2004-2 6 20.11.2004 18:03
Uhrzeit problem mit sekunden. c01001 PHP Tipps 2004 8 21.09.2004 20:50
Uhrzeit in Formular einbauen PHP Tipps 2004 2 28.08.2004 13:21

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php differenz datum wochentag uhrzeit -excel, php uhrzeit abfragen, in sql abfrage belegung, sql statement terminüberschneidung abfragen, between datum und uhrzeit, condition php datum und uhrzeit, php bestimmtes datum und uhrzeit abfragen, php sql abfrage terminüberschneidung, sql terminüberschneidung uhrzeit, anfrage uhrzeit für termin am bestimmten tag, terminüberschneidung uhrzeit, nicht vergebene sachen sql abfragen, php conditions terminüberschneidung, uhrzeit abfrage php, 20.11.2004 wochentag?, belegungsdatum, urzeit abfragen php, datumsfeld mit 0 belegen datenbank, abfrage wochentag und uhrzeit, java datum anfangszeit endzeit -differenz

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:16 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.