Daten zwischen zwei Tagen filtern

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Peter1977
User
Beiträge: 85
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,

Muss eine Datenbankabfrage jeden Tag machen die zwischen Uhrzeit 22 Uhr bis 6Uhr des nächsten Tages liegt

Wenn ich jetzt den 3 Tag im Monat abfrage so habe ich alle zwischen 22 und 0Uhr am 3.
und alles zwischen 0-6Uhr am 4. Tag geschrieben

der Jetzige SQL Code sieht so aus

[codebox=postgresql file=Unbenannt.sql]
SELECT
COUNT(arbeitsauftrag_id) AS Stk,
SUM(fertiggewicht) AS Gewicht,
SUM(zeit) AS Zeit,
EXTRACT(day FROM datum) AS Day
FROM arbeitsauftrag
WHERE
date_part('year',datum)='2016' AND date_part('month',datum)='11' AND
NOT (EXTRACT(Hour FROM datum)<22 AND EXTRACT(HOUR FROM datum)>=6)
AND abteilung='1'
GROUP BY Day
ORDER BY Day
[/code]

Im Moment stehe ich an wie die Abfrage umgeändert werden muss.

mfg Peter
BlackJack

@Peter1977: Musst Du die Abfrage jeden Tag für den Folgetag machen, oder eine Abfrage die das Ergebnis für alle Tage liefert? Im Text sprichst Du vom 3. und 4. im Monat, in der SQL-Abfrage kommt der Tag dann aber gar nicht vor‽

Für einen Tag würde ich die Abfrage so schreiben:

Code: Alles auswählen

SELECT count(arbeitsauftrag.id) AS stk,
       sum(arbeitsauftrag.fertiggewicht) AS gewicht,
       sum(arbeitsauftrag.zeit) AS zeit 
FROM arbeitsauftrag 
WHERE arbeitsauftrag.abteilung = '1' AND arbeitsauftrag.datum BETWEEN ? AND ?
Und Start und Ende für die Platzhalter in Python berechnen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Alternativ kann man natürlich das zweite Datum aus dem ersten + einen Offset von 8 Stunden berechnen. Je nach SQL-Server kann dies unterschiedlich praktikabel sein. Somit bräuchte man nun noch einen Parameter übergeben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Wobei man da dann darauf achten sollte das zweimal im Jahr die Zeitspanne zwischen 22 und 6 Uhr nicht 8 Stunden beträgt. Also in beiden Fällen muss man darauf achten, sowohl bei der Datenbank als auch wenn man die Grenzen in Python berechnet.
Peter1977
User
Beiträge: 85
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,
@Peter1977: Musst Du die Abfrage jeden Tag für den Folgetag machen, oder eine Abfrage die das Ergebnis für alle Tage liefert? Im Text sprichst Du vom 3. und 4. im Monat, in der SQL-Abfrage kommt der Tag dann aber gar nicht vor‽
Ne das läuft dann über das ganze Monat

vom 1 bis 28-31 je nach monat
ergebnis sieht dan so au

Tag Stk Gewicht
1 1 543
2 3 120
3 2 500
4 1 125
5
6 3 200

Tag 3 läuft bei der oberen Abfrage von 22-6
Tag 4 ist ein Samstag
Tag 5 ein Sonntag
6 wieder ein Montag

alles nur zum Beispiel

das läuft in der Obigen Abfrage ja so das es am Tag 3 zuerst 0-6Uhr und dann 22-0Uhr genommen wird
Richtig wäre Tag 3 von 22-0Uhr und dann vom Folgetag vom 4. von 0-6Uhr dazugenommen wird.

mfg Peter
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@BlackJack: Stimmt. (Doofe Zeitumstellung :twisted: )

Dann ist es vermutlich besser, das Datum des nächsten Tages aus dem ersten zu berechnen und dort 6:00 Uhr fix zu setzen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Peter1977: Ich würde wahrscheinlich einfach zwei Abfragen absetzen und die dann auf Clientseite zusammenrechnen.
Peter1977
User
Beiträge: 85
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,
Ich würde wahrscheinlich einfach zwei Abfragen absetzen und die dann auf Clientseite zusammenrechnen.
Danke Gute Idee. Leicht umzusetzen. Klaue ich mir wenn ich darf.

mfg Peter
Antworten