BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- [SQL] Zeitintervalle (http://www.black-board.net/thread.php?threadid=22335)


Geschrieben von bomus am 10.07.2006 um 19:21:

  [SQL] Zeitintervalle

Ich schreibe das hier rein weil ich weiß nicht genau wo sonst ich es schreiben sollte:

Ich hab folgendes Problem:

In einen Datenbank (zwischen andere Tabellen) ich habe zwei Tabellen:

1. Prozess mit Feldern: Prozess_ID Prozess_Startdatum Prozess_Enddatum
2. Quartal mit Feldern: Quartal_ID Quartal_Startdatum Quartal_Enddatum

Prozess_Startdatum = P_Start
Prozess_Enddatum = P_End
Quartal_Startdatum = Q_Start
Quartal_Enddatum = Q_End

Mit Hilfe dieser Tabellen ich muss bestimmen wie viele Prozesse in jede Geschäftsjahrquartal gelaufen sind.

Ich habe so eine Abfrage geschrieben:

code:
1:
2:
3:
4:
5:
6:
SELECT Q_ID, COUNT(*) AS [Anzahl Prozesse pro Quartal]
FROM Quartal
WHERE Q_Start <= (SELECT P_Start FROM Prozess) AND Q_End >= (SELECT P_End FROM Prozess)
OR Q_Start > (SELECT P_Start FROM Prozess) AND Q_Start < (SELECT P_End FROM Prozess)
OR Q_Start < (SELECT P_Start FROM Prozess) AND Q_End < (SELECT P_End FROM Prozess)
GROUP BY Q_ID;
Es funktioniert aber nicht und ich versuche schon seit einige lange Stunden zu verstehen warum Augen rollen

Gibt eine Möglichkeit das irgendwie anders zu machen? und wenn, wie?
vielleicht das?:
Zitat:
This expression yields true when two time periods (defined by their endpoints) overlap, false when they do not overlap. The endpoints can be specified as pairs of dates, times, or time stamps; or as a date, time, or time stamp followed by an interval.
( start1, end1 ) OVERLAPS ( start2, end2 )
( start1, length1 ) OVERLAPS ( start2, length2 )


Danke im Voraus Augenzwinkern
bomus



Geschrieben von phlox81 am 10.07.2006 um 19:27:

 

http://www.w3schools.com/sql/sql_between.asp

Dafür gibts imho BETWEEN.



Geschrieben von LX am 10.07.2006 um 19:42:

 

Also nochmal langsam: Du willst rausfinden, wieviele Prozesse in einem Quartal stattfanden. Möglichkeiten wären hier:



Alle 4 Varianten willst du offenbar gleichwertig behandeln, wenn also irgendeine Phase des Projektes innerhalb des Quartals X stattfand, soll es zählen. Klingt in SQL für mich etwa nach sowas:

code:
1:
2:
3:
4:
5:
6:
SELECT q.id, count(p.id) FROM quartal q
LEFT JOIN prozess p
ON ( ( p.start BETWEEN q.start AND q.end ) OR
     ( p.end   BETWEEN q.start AND q.end ) OR
     ( p.start < q.start AND p.end > q.end ) )
GROUP BY q.id


Das ist nicht getestet, da ich zu faul war, mit ein paar Testdaten zu schreiben. Wenn das also nicht klappt und du nicht weiter kommst, wär sehr geholfen, wenn du eine kleine Testdatenbank als SQL-Export anhängen würdest.



Geschrieben von bomus am 10.07.2006 um 22:23:

 

Danke dir Lx...
so, ich bekomme ein Fehler Meldung:
Verknüpfungsausdruck nicht unterstützt

Ich werde aber versuchen damit klar zu kommen. Falls ich wirklich nicht mehr weiter komme, ich werde demnächst eine Testdatenbank anhängen.

Soweit ich danke euch Augenzwinkern

EDIT:

Es ging darum dass einige Prozesse mehrmals gezählt sein müssten und JOIN hatte ein Problem damit...

Also, ich bin (mit ein wenig Hilfe Augenzwinkern ) zu das gekommen:

code:
1:
2:
3:
4:
SELECT Quartal.Q_ID, count(Prozess.P_ID) AS Anzahl
FROM Quartal, Prozess
WHERE NOT  (Prozess.P_End < Quartal.Q_Start OR Prozess.P_Start > Quartal.Q_End)
GROUP BY Quartal.Q_ID;
Das sieht (dummerweise) viel einfacher aus Augen rollen

Noch mal ich danke euch beide...
bomus

Nochmal Edit Augenzwinkern

Ich habe wieder ein Problem mit den Zeitintervallen …
Ich muss dieses Mal berechnen wie viele Arbeitstage zwischen Datum 1 und Datum 2 sind.

Also, um einfach zu wissen wie viele Tage dazwischen sind, funktioniert einfach:
code:
1:
2:
SELECT (blub_enddatum – blub_startdatum) AS Dauer_Tage
FROM blub;
Wie könnte ich aber das Wochenende rausziehen?

Danke Augenzwinkern
bomus



Geschrieben von phlox81 am 25.07.2006 um 10:52:

 

Hm, ich weiss nicht ob MYSQL da eine entsprechende resource für bietet,
oder welche Datenbank du auch benutzt. In standard SQL ist mir nichts dafür
bekannt, zu dem man dann evtl. noch das Problem der lokalen Feiertage
hätte, z.b. wenn in NRW frei ist, aber in Berlin nicht.

Über google hab ich was für PHP gefunden, ka obs funktioniert und sinnvoll ist:
http://www.bigbold.com/snippets/posts/show/807

Hm, evtl. findest du in mysql Doku noch was:
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html



Geschrieben von bomus am 25.07.2006 um 20:07:

 

So … heute hat mir jemanden erzählt das eine mySQL Funktion gebe, die „workday“ heißt und die benutzt werden könnte die Arbeitstage zu berechnen… und wenn die lokale Einstellungen auch richtig eingestellt sind, würde es sogar die Feiertage irgendwie erkennen. Kann ich aber nichts über diese „wunder Funktion“ finden… weißt eine von euch vielleicht etwas darüber?

bomus



Geschrieben von LX am 25.07.2006 um 21:57:

Achtung

Dann ist derjenige wohl schlauer als die MySQL-Dokumentation, dort findet sich dazu nämlich nichts. Es gibt eine Funktion WORKDAY() in Excel, aber mehr finde ich dazu auch nicht Augenzwinkern

Du wirst also nicht umhin kommen, dir da selbst was zu programmieren oder was fertiges anzupassen wie aus Phlox' erstem Link z.B.



Geschrieben von bomus am 26.07.2006 um 07:07:

 

Ah ja LX, wenn es mir nur möglich wäre…
Ich darf leider nichts bei der Arbeit installieren. Ich kann auch kein externer Server benutzen. Also ich muss innerhalb mySQL / MS Access bleiben. Anderseits auch wenn ich andere Möglichkeiten hätte, hätte ich Wahrscheinlich nicht genug Zeit dafür, gesehen dass in 2 Wochen ich werde nicht mehr in mein Abteilung arbeiten. Also, praktisch bleiben mir nur 4-5 Tage zeit (ich arbeite nur 2,5 Tage pro Woche)…

Also, all dass gesehen, hat ein Kolleg von mir versprochen dass er mir damit hilft… und falls so eine wunder Funktion gibt, werde ich es hier posten, (oder was auf immer für eine Lösung finde)… mal sehen wie das wird Augenzwinkern

bomus

EDIT:

So, für das Zeitintervallen Problem hab ich noch nicht eine Lösung die ich hier posten könnte (kann sein dass ich die auch nicht haben werdeAugenzwinkern

Hab aber eine andere dumme frage smile
In den gleichem Projekt muss ich den „Fulltime Equivalent“ (FTE) der Mitarbeiter berechnen. (dass heisst einer der z.b. 35 Stunden die Woche arbeitet zählt als 1 Person und einen der 20 Stunden die Woche 0,57)
So, dafür ich hab 2 Tabellen. Eine der mitarbeiter - (FTEs) und Mitarbeter Kategorie (FTEsKAT). In Mitarbeiter ich hab eine spalte „Arbeitsstunden“ und in Mitarbeiter Kategorie ich hab cca 5 kategorien (interne externe etc.)

Um das zu berechnen was ich brauche hab ich die folgende abfrage:
code:
1:
2:
3:
4:
SELECT FTEsKAT.KAT, Sum(FTEs.AStunden/35) AS Wert
FROM FTEsKAT, FTEs
WHERE (FTEs.KAT_ID=FTEsKAT.KAT_ID)
GROUP BY KAT;
In dieser Weise habe ich der wert der Fulltime Equivalent pro jede Kategorie. Aber um meine Endergebnis zu haben (die was anderes eigentlich ist wie z.b. #Interne fulltime Equivalent / #Gesamt fulltime Equivalent und ein Paar andere) muss ich noch ein Paar andere Abfragen schreiben.

Jetzt die dumme Frage: Wie mache ich es in MS Access Augenzwinkern dass ich der Fulltime Equivalent direkt in der Tabelle „mitarbeiter“ berechne, so dass ich nicht 15 Abfragen habe wenn nicht alle wirklich nötig sind… Ich meine jetzt wie sage ich ihm dass er in eine spalte AStunden/35 berechnen sollte? (hab versucht aber sieht so aus als ich und MS Access nicht die gleiche Sprache sprechen Zunge raus )

Also, noch mal EDIT:

Zu meine dumme Frage… wurde mir erklärt dass es nicht geht in eine Datenbanktabelle eine „Berechnungsspalte“ zu haben. Sollte man nicht machen, und kann man eigentlich auch nicht. Dass es war wirklich eine dumme Frage … oder? Zunge raus

Über Abzug der Wochenende und Feiertage aus eine Zeitperiode…. Wurde mir erklärt dass in mySQL / MS Access wird eine Funktion „einfach“ definiert (durch einen „Modul“) die danach in eine Abfrage benutzt sein kann…

So, endlich muss ich sagen dass ich Freu bin… Hab heute eine Dokumentation über der ganzen Projekt geschrieben und es weiter meiner Kollegen gegeben, so dass sie es weiterarbeiten können nachdem ich nicht mehr in der Abteilung bin… Klingt nicht gut dass ich etwas unbeendet bei der Arbeit lasse, aber eigentlich dieses Projekt hätte nicht meine Aufgabe sein sollte und was ich trotzdem da gemacht habe, sieht eigentlich nicht schlecht smile (so wurde mir gesagt)

Danke auf jeden fall für eure Hilfe Augenzwinkern
bomus


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH