BlackBoard » Design, Programmierung & Entwicklung » Programmieren » [SQL] Zeitintervalle » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen [SQL] Zeitintervalle
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
bomus bomus ist weiblich
Aufsteiger


Dabei seit: 03.11.2004
Beiträge: 53

[SQL] Zeitintervalle       Zum Anfang der Seite springen

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

__________________
Durch Fehler lernt man viel (es sollte auch für mein Deutsch gelten Augenzwinkern )
10.07.2006 19:21 bomus ist offline E-Mail an bomus senden Beiträge von bomus suchen
phlox81 phlox81 ist männlich
Bote des Lichts und Moderator


images/avatars/avatar-2264.jpg

Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo

      Zum Anfang der Seite springen

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

Dafür gibts imho BETWEEN.

__________________
Intelligenz ist eine Illusion des Menschen

phlox81.de | codenode.de
10.07.2006 19:27 phlox81 ist offline E-Mail an phlox81 senden Homepage von phlox81 Beiträge von phlox81 suchen
LX LX ist männlich
El Comandante en Jefe


images/avatars/avatar-2290.gif

Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx

      Zum Anfang der Seite springen

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

  • Start und Ende des Prozesses liegen im Quartal X
  • Start liegt im Quartal X, Ende in einem späteren Quartal
  • Start in einem früheren Quartal, Ende in Quartal X
  • Start liegt in einem früheren Quartal, Ende in einem späteren


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.

__________________
JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard

"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

10.07.2006 19:42 LX ist offline E-Mail an LX senden Homepage von LX Beiträge von LX suchen
bomus bomus ist weiblich
Aufsteiger


Dabei seit: 03.11.2004
Beiträge: 53

Themenstarter Thema begonnen von bomus
      Zum Anfang der Seite springen

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

__________________
Durch Fehler lernt man viel (es sollte auch für mein Deutsch gelten Augenzwinkern )

Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von bomus: 25.07.2006 10:10.

10.07.2006 22:23 bomus ist offline E-Mail an bomus senden Beiträge von bomus suchen
phlox81 phlox81 ist männlich
Bote des Lichts und Moderator


images/avatars/avatar-2264.jpg

Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo

      Zum Anfang der Seite springen

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/d...-functions.html

__________________
Intelligenz ist eine Illusion des Menschen

phlox81.de | codenode.de
25.07.2006 10:52 phlox81 ist offline E-Mail an phlox81 senden Homepage von phlox81 Beiträge von phlox81 suchen
bomus bomus ist weiblich
Aufsteiger


Dabei seit: 03.11.2004
Beiträge: 53

Themenstarter Thema begonnen von bomus
      Zum Anfang der Seite springen

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

__________________
Durch Fehler lernt man viel (es sollte auch für mein Deutsch gelten Augenzwinkern )
25.07.2006 20:07 bomus ist offline E-Mail an bomus senden Beiträge von bomus suchen
LX LX ist männlich
El Comandante en Jefe


images/avatars/avatar-2290.gif

Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx

Achtung       Zum Anfang der Seite springen

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.

__________________
JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard

"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

25.07.2006 21:57 LX ist offline E-Mail an LX senden Homepage von LX Beiträge von LX suchen
bomus bomus ist weiblich
Aufsteiger


Dabei seit: 03.11.2004
Beiträge: 53

Themenstarter Thema begonnen von bomus
      Zum Anfang der Seite springen

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

__________________
Durch Fehler lernt man viel (es sollte auch für mein Deutsch gelten Augenzwinkern )

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von bomus: 01.08.2006 17:03.

26.07.2006 07:07 bomus ist offline E-Mail an bomus senden Beiträge von bomus suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » [SQL] Zeitintervalle

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH