SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Einführung in XHTML, CSS und Webdesign

Einführung in XHTML, CSS und Webdesign zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQL/MySQLi

MySQL/MySQLi Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQL/MySQLi diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 22.04.2011, 18:54:43
goldlife goldlife ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 36
Beiträge: 15
datetime Zeitraum zwischen start und end abfragen

Hallo erstmal!

ich habe ein kleines Problem.
Ich habe folgende Tabellen Struktur:
[img=http://www.abload.de/thumb/1cnmh.jpg]

und ich möchte wissen, ob user 6 in einem bestimmten Zeitraum schon arbeitet.
wie mache ich das am besten?

angenommen der Benutzer arbeitet (wie im Bild oben) schon am 22.04.2011 von 8-19 Uhr.
Wenn er nun versucht nochmal am selben Tag INNERHALB dieses Zeitraums zu arbeiten möchte ich mit PHP eine Fehlermeldung ausgeben.

nur, wie muss mein SQL Befehl aussehen?
angenommen der benutzer versucht, am 22.04.2011 einen datensatz zwischen 10 und 14
uhr einzutragen. das würde ja in dem Bereich fallen, wo er schon arbeitet.
Also müsste mein SQL Befehl einen datensatz zurückgeben.

Versucht er aber einen Datensatz zu speichern der ausserhalb (zb. 22.04.2011 von 6-8 Uhr) würde mein SQL Befehl KEINEN Datensatz anzeigen.

so nun zu meinem problem:
angenommen der user 6 möchte am 22.04.2011 von 8-20 Uhr arbeiten:

Code:
SELECT * FROM `occupancy` 
WHERE `start` >= '2011-04-22 08:00:00'
AND `end` <= '2011-04-22 20:00:00'
AND user_id = 1
- klappt - ich bekomme nun einen Datensatz zurück, und kann via PHP eine Fehlermeldung ausgeben.

Wenn der Benutzer aber nun als Startdatum wieder 08 Uhr auswählt,
aber als End Datum 16 Uhr, klappt es nicht.

Code:
SELECT * FROM `occupancy` 
WHERE `start` >= '2011-04-22 08:00:00'
AND `end` <= '2011-04-22 16:00:00'
AND user_id = 1
Nun bekomme ich ein leeres Resultat.
irgendwie habe ich da ein logisches Problem.
kann mir jemand helfen, wie mein SQL Befehl aussehen muss, um nach Eingabe des users von startzeit und endzeit richtig zu überprüfen ob user 6 an diesem tag um diese Uhrzeit schon eingetragen ist?
Mit Zitat antworten
  #2  
Alt 22.04.2011, 21:31:17
Ckaos Ckaos ist offline
Member
 
Registriert seit: Nov 2007
Beiträge: 843
AW: datetime Zeitraum zwischen start und end abfragen

Hi

wie wärs mit abfragen ob an dem Tag schon was eingetragen ist?
Code:
SELECT COUNT(id) FROM tabelle WHERE user_id=X AND DATE(start)=DATUM
Bekommste > 0 kann er nicht mehr eintragen oder du machst ein UPDATE.


mfg

CKaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
Mit Zitat antworten
  #3  
Alt 23.04.2011, 17:43:39
goldlife goldlife ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 36
Beiträge: 15
AW: datetime Zeitraum zwischen start und end abfragen

ja das ist im grunde schon ok, nur dann hätte ich das problem
das der user zb. nicht von 8-12, und dann wieder von 14-18 uhr arbeiten kann,
weil ja dann das eintragen nicht mehr klappt -> der count ergibt ja schon 1.

die lösung wäre hm nja nur eher eine notlösung, elegant ist sie leider nicht. :-(
danke trotzdem.
Mit Zitat antworten
  #4  
Alt 23.04.2011, 17:47:34
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 11
Beiträge: 395
AW: datetime Zeitraum zwischen start und end abfragen

zeig die Tabellenstruktur doch mal mit

Code:
mysql>SHOW CREATE TABLE occupancy;
Welche Datentypen haben denn die Spalten START und END?

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #5  
Alt 23.04.2011, 19:42:31
goldlife goldlife ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 36
Beiträge: 15
AW: datetime Zeitraum zwischen start und end abfragen

es sind beides datetime Felder:

Code:
CREATE TABLE `occupancy` (
 `id` bigint(11) NOT NULL AUTO_INCREMENT,
 `user_id` int(11) NOT NULL,
 `workstation_id` int(11) NOT NULL,
 `start` datetime NOT NULL,
 `end` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8
Mit Zitat antworten
  #6  
Alt 23.04.2011, 19:55:35
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 11
Beiträge: 395
AW: datetime Zeitraum zwischen start und end abfragen

also bei mir geht's

Code:
INSERT INTO occupancy VALUES
(1, 1, 6 , DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 4 HOUR), CURRENT_TIMESTAMP );


mysql> select * from occupancy;
+----+---------+----------------+---------------------+---------------------+
| id | user_id | workstation_id | start               | end                 |
+----+---------+----------------+---------------------+---------------------+
|  1 |       1 |              6 | 2011-04-23 15:50:47 | 2011-04-23 19:50:47 |
+----+---------+----------------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql>


SELECT * FROM occupancy
 WHERE user_id = 1
   AND start >= '2011-04-23 15:50:47'
   AND end <= '2011-04-23 19:50:47';
+----+---------+----------------+---------------------+---------------------+
| id | user_id | workstation_id | start               | end                 |
+----+---------+----------------+---------------------+---------------------+
|  1 |       1 |              6 | 2011-04-23 15:50:47 | 2011-04-23 19:50:47 |
+----+---------+----------------+---------------------+---------------------+
1 row in set (0.01 sec)

mysql>
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #7  
Alt 23.04.2011, 22:18:14
Ckaos Ckaos ist offline
Member
 
Registriert seit: Nov 2007
Beiträge: 843
AW: datetime Zeitraum zwischen start und end abfragen

Hi


Zitat:
Zitat von goldlife Beitrag anzeigen
ja das ist im grunde schon ok, nur dann hätte ich das problem
das der user zb. nicht von 8-12, und dann wieder von 14-18 uhr arbeiten kann,
weil ja dann das eintragen nicht mehr klappt -> der count ergibt ja schon 1.
Klar hab ich überlesen das du weitere Eintragungen zulassen willst.

Arbeite mit BETWEEN


mfg

CKaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!

Geändert von Ckaos (23.04.2011 um 22:48:03 Uhr)
Mit Zitat antworten
  #8  
Alt 04.05.2011, 15:25:43
goldlife goldlife ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 36
Beiträge: 15
AW: datetime Zeitraum zwischen start und end abfragen

ich habe folgendes Problem.

ich habe die untenstehende Datenbank struktur:

Code:
CREATE TABLE `occupancy` (
 `id` bigint(11) NOT NULL AUTO_INCREMENT,
 `user_id` int(11) NOT NULL,
 `workstation_id` int(11) NOT NULL,
 `start` datetime NOT NULL,
 `end` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8
und diese inserts:

Code:
INSERT INTO `occupancy` (`id`, `user_id`, `workstation_id`, `start`, `end`) VALUES
(1, 1, 6, '2011-04-25 12:00:00', '2011-04-25 15:59:59'),
(3, 1, 1, '2011-04-27 16:00:00', '2011-04-27 18:59:59'),
(4, 1, 1, '2011-05-05 08:00:00', '2011-05-05 16:59:59'),
(5, 2, 4, '2011-04-26 12:00:00', '2011-04-26 15:59:59'),
(6, 4, 3, '2011-04-26 11:00:00', '2011-04-26 16:59:59'),
(7, 3, 1, '2011-04-26 08:00:00', '2011-04-26 18:59:59'),
(8, 1, 1, '2011-05-06 08:00:00', '2011-05-06 17:59:59'),
(9, 1, 1, '2011-05-03 12:00:00', '2011-05-03 15:59:59'),
(10, 5, 1, '2011-05-02 10:00:00', '2011-05-02 15:59:59'),
(11, 1, 2, '2011-05-02 08:00:00', '2011-05-02 18:59:59'),
(12, 2, 3, '2011-05-02 10:00:00', '2011-05-02 17:59:59'),
(13, 4, 4, '2011-05-02 12:00:00', '2011-05-02 13:59:59'),
(14, 1, 1, '2011-05-04 10:00:00', '2011-05-04 14:59:59'),
(15, 1, 1, '2011-05-08 08:00:00', '2011-05-08 10:59:59'),
(16, 1, 1, '2011-04-18 08:00:00', '2011-04-18 08:59:59'),
(17, 2, 4, '2011-05-03 13:00:00', '2011-05-03 17:59:59'),
(20, 2, 1, '2011-05-08 09:00:00', '2011-05-08 10:59:59');
und ich möchte für meinen kalender für jeden einzelnen tag, und jede einzelne
stunde die anzahl der user ausgeben die dann aktuell arbeiten.
nur wie stelle ich das an?

ich bin soweit, das ich weiß das ich das mit einem self Join hinbekomme:

Code:
SELECT a.id, COUNT( * ) AS `overlaps` , a.user_id, a.workstation_id, a.start, a.end
		
FROM `occupancy` AS a, `occupancy` AS b

      WHERE b.end > a.start 
		&& a.end > b.start 
		&& a.ID != b.id
		&& a.start >= '2011-05-02'
		&& a.end < '2011-05-09'
						
GROUP BY a.id
ORDER BY a.start
dort habe ich dann aber folgendes Problem:
Dieser Select gibt mir die Datensätze und die Anzahl der Überschneidungen pro tag aus,
was ja an sich schon ok ist. also weiß ich mit diesem Query das es zb. am Tag 02.05.2011
3 Überschneidungen gibt, weil dort schon 4 user arbeiten, und deren Arbeitszeit sich überschneidet, und das es am 03.05.2011 1 überschneidung mit 2 usern kommt.

was ich aber eigentlich selektieren will, und wo ich absolut dran verzweifele ist:
ich brauche so etwas wie:


Code:
am 02.05.2011 von 07:00:00 bis 07:59:59 -> 0 User (bzw. 0 Überschneidungen)
am 02.05.2011 von 08:00:00 bis 08:59:59 -> 1 User (bzw. 0 Überschneidungen)
am 02.05.2011 von 09:00:00 bis 09:59:59 -> 1 User (bzw. 0 Überschneidungen)
am 02.05.2011 von 10:00:00 bis 10:59:59 -> 3 User (bzw. 2 Überschneidungen)
am 02.05.2011 von 11:00:00 bis 11:59:59 -> 3 User (bzw. 2 Überschneidungen)
am 02.05.2011 von 12:00:00 bis 12:59:59 -> 4 User (bzw. 3 Überschneidungen)
am 02.05.2011 von 13:00:00 bis 13:59:59 -> 4 User (bzw. 3 Überschneidungen)
am 02.05.2011 von 14:00:00 bis 14:59:59 -> 3 User (bzw. 2 Überschneidungen)
am 02.05.2011 von 15:00:00 bis 15:59:59 -> 3 User (bzw. 2 Überschneidungen)
am 02.05.2011 von 16:00:00 bis 16:59:59 -> 2 User (bzw. 1 Überschneidungen)
am 02.05.2011 von 17:00:00 bis 17:59:59 -> 2 User (bzw. 1 Überschneidungen)
am 02.05.2011 von 18:00:00 bis 18:59:59 -> 1 User (bzw. 0 Überschneidungen)
am 02.05.2011 von 19:00:00 bis 19:59:59 -> 0 User (bzw. 0 Überschneidungen)

(zb. für den 02.05.2011)
[img=http://www.abload.de/thumb/1kmyh.jpg]

ist das irgendwie mit SQL möglich?
Mit Zitat antworten
  #9  
Alt 04.05.2011, 21:05:29
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 11
Beiträge: 395
AW: datetime Zeitraum zwischen start und end abfragen

Zitat:
Zitat von goldlife Beitrag anzeigen
ist das irgendwie mit SQL möglich?
Prinzipiell schon, aber einfach ist es nicht. Die Richtung könnte so aussehen:

a) eine neue Tabelle um die "Mess-"Zeitpunkte festzulegen

Code:
CREATE TABLE zeitraum(
  id INT NOT NULL,
  zeitpunkt DATETIME NOT NULL
);

INSERT INTO zeitraum VALUES 
  (1, '2011-04-26 07:00:00'),
  (2, '2011-04-26 08:00:00'),
  (3, '2011-04-26 09:00:00'),
  (4, '2011-04-26 10:00:00'),
  (5, '2011-04-26 11:00:00');
b) folgende Abfrage zeigt, zu welchen Zeitpunkt wie viele User da waren

Code:
SELECT z.zeitpunkt, COUNT(DISTINCT o.user_id) AS anzahl_user
  FROM zeitraum z
  LEFT JOIN occupancy o
    ON z.zeitpunkt BETWEEN o.start AND o.end
GROUP BY z.zeitpunkt
ORDER BY z.zeitpunkt
+---------------------+-------------+
| zeitpunkt           | anzahl_user |
+---------------------+-------------+
| 2011-04-26 07:00:00 |           0 |
| 2011-04-26 08:00:00 |           1 |
| 2011-04-26 09:00:00 |           1 |
| 2011-04-26 10:00:00 |           1 |
| 2011-04-26 11:00:00 |           2 |
+---------------------+-------------+
5 rows in set (0.00 sec)


mysql>
Mal als Überlegung....

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.

Geändert von thomas_w (04.05.2011 um 21:17:14 Uhr)
Mit Zitat antworten
  #10  
Alt 04.05.2011, 22:12:35
goldlife goldlife ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 36
Beiträge: 15
AW: datetime Zeitraum zwischen start und end abfragen

das ist in der tat ein interessanter lösungsansatz, danke dafür.
der nachteil daran den ich da sehe, ist das die tabelle zeitraum
ja für jeden neuen tag alle stunden speichern muss...
also für den 26.04, für den 27.04... usw.
besser wäre es natürlich wenn man generell die möglichkeit hätte den zeitpunkt
ohne die bindung zu einem tag in einer tabelle festzulegen.
das geht aber dort nicht weil ich ja mit dem datum selektiere...
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
zwischen dienst_start (datetime) und dienst_ende (datetime) Svenija MySQL/MySQLi 4 19.09.2006 15:56:05
suche nach Monaten mit Start / Ende Hushi2 PHP Grundlagen 5 16.10.2002 15:39:38


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:52:53 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.


© 2001-2021 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt