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
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
22.04.2011, 18:54:43
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 38
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?
|
22.04.2011, 21:31:17
|
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!
|
23.04.2011, 17:43:39
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 38
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.
|
23.04.2011, 17:47:34
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
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.
|
23.04.2011, 19:42:31
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 38
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
|
23.04.2011, 19:55:35
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
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.
|
23.04.2011, 22:18:14
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: datetime Zeitraum zwischen start und end abfragen
Hi
Zitat:
Zitat von goldlife
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)
|
04.05.2011, 15:25:43
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 38
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?
|
04.05.2011, 21:05:29
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: datetime Zeitraum zwischen start und end abfragen
Zitat:
Zitat von goldlife
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)
|
04.05.2011, 22:12:35
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 38
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...
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 21:45:38 Uhr.
|