|
|
|
|
[SQL] Zeitintervalle |
bomus
Aufsteiger
Dabei seit: 03.11.2004
Beiträge: 53
|
|
[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
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
bomus
__________________ Durch Fehler lernt man viel (es sollte auch für mein Deutsch gelten
)
|
|
10.07.2006 19:21 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
|
10.07.2006 19:27 |
|
|
LX
El Comandante en Jefe
Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx
|
|
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 |
|
|
bomus
Aufsteiger
Dabei seit: 03.11.2004
Beiträge: 53
Themenstarter
|
|
|
10.07.2006 22:23 |
|
|
phlox81
Bote des Lichts und Moderator
Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo
|
|
|
25.07.2006 10:52 |
|
|
bomus
Aufsteiger
Dabei seit: 03.11.2004
Beiträge: 53
Themenstarter
|
|
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
)
|
|
25.07.2006 20:07 |
|
|
LX
El Comandante en Jefe
Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx
|
|
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
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 |
|
|
bomus
Aufsteiger
Dabei seit: 03.11.2004
Beiträge: 53
Themenstarter
|
|
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
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 werde
Hab aber eine andere dumme frage
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
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
)
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?
Ü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
(so wurde mir gesagt)
Danke auf jeden fall für eure Hilfe
bomus
__________________ Durch Fehler lernt man viel (es sollte auch für mein Deutsch gelten
)
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von bomus: 01.08.2006 17:03.
|
|
26.07.2006 07:07 |
|
|
|
|
|
|