"Reine" SQL Abfrage von der Max/Min-Temperatur einer Nacht

  • Hallo zusammen.

    Folgende Situation dient als Vorgabe:

    In eine mySQL DB wird alle 5 MInuten die Aussentemperatur geschrieben.

    Aktuell schaffe ich es die max und Min Temperatur pro Tag in einer View darzu stellen.

    Kann mit jemand von euch einen Tipp geben wie ich die Min und Max Tempratur der Nacht (sagen wir zwischen 22uhr und 6 uhr) in eine View bekomm, inkl "automatischer" aktualisierung?

    Die Tabelle aht als "nützliche" Spalten das Datum (ohne Zeit) und die Zeit zur Verfügung.

    Gruss Dani

    Einmal editiert, zuletzt von dll-live (17. Dezember 2017 um 23:51) aus folgendem Grund: Rechtschreibfehler korrigiert

  • "Reine" SQL Abfrage von der Max/Min-Temperatur einer Nacht? Schau mal ob du hier fündig wirst!

  • Sali Hofei.

    Das weiss ich nciht genau - kann man beim befüllen jeodch sicher irgendwie umbiegen das es so ist. jedoch ist mir der Weg danach noch nicht klar.

    Wie willst du automatisch die einzelnen Nächte raus holen?

    Pro Tag ist easy (group by Date)... IWe geht das Pro nacht?

    Gruss Dani

  • Hallo,

    ja, kann man -> RTFM :)

    Der Query sieht ungefähr so aus:

    SQL
    SELECT MAX(Aussentemp), MAX(Aussentemp) FROM tabellenname WHERE Datum BETWEEN xxx AND yyy AND Zeit BETWEEN xxx AND yyy

    Ggf. muss man noch die ein oder andere Datumsfunktion von MySQL nutzen - habe MySQL schon länger nicht mehr benutzt.

    Waurm wird bei Datum kein Datum sondern ein Zeitstempel ohne Uhrzeit geschreiben? Dies sieht falsch aus. Entweder ein "richtiger" Zeitstempel oder nur ein Datum.

    Gruß, noisefloor

  • Hallo,

    ja, kann man -> RTFM :)

    Der Query sieht ungefähr so aus:

    SQL
    SELECT MAX(Aussentemp), MAX(Aussentemp) FROM tabellenname WHERE Datum BETWEEN xxx AND yyy AND Zeit BETWEEN xxx AND yyy

    so hab ich auch erst gedacht, allerdings schließt das auch die Zeit 0-6 vom ersten Tag und 22-0 vom zweiten Tag ein, um bei den Beispielzeiten zu bleiben. Das muss noch ausgeschlossen werden und sollte machbar sein. Nur grad nicht für mich, ist zu kalt zum denken. Ich glaube aber, Datum und Zeit gemeinsam zu verwenden, würde es vereinfachen.

    Gruß, STF

  • Da die "ID" vorhanden ist, könnte man auch die ID dafür verwenden.

    Es werden pro Stunde 12 Einträge angelegt. Für die Zeit zwischen 22 und 6 Uhr sind es dann 96 Einträge wenn ich mich nicht verrechnet habe.

    Daraus einen Abfrage bauen für die letzten 96 Einträge und daraus wiederum den höchsten oder niedrigsten Wert nehmen?

  • Zitat

    MySQL TIMESTAMP()

    TIMESTAMP(expr1,expr2)

    - expr1 A date or datetime value.

    - expr2 A time expression.

    Damit sollte sich doch die Nacht oder jeder andere Zeitabschnitt eingrenzen lassen.

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • Code
    select datum, zeit, min(aussentemperature), max(aussentemperature) 
    from deinTabellenName 
    group by datum, hour(zeit)
        order by datum desc, zeit desc;

    Du bekommst eine stündliche Übersicht der min/max-Temperaturen... die jetzt auf die Nachtstunden eingrenzen sollte kein Problem sein... (between-Funktion)

    Anmerkung:

    Deine "datum" Spalte sollte entweder vom Format "date" sein oder, wenn du "timestamp" so wie jetzt verwendest, auch die Uhrzeit enthalten (die "zeit" Spalte ist dann überflüssig).

    Das Separieren der Uhrzeit aus dem Timestamp ist kein Problem, MySQL hat da Funktionen für...

  • Du kannst die Bedingungen klammern - ungefähr so:

    WHERE (Datum = "01.01.2018" AND Zeit BETWEEN 22.00 AND 24.00) OR (Datum = "02.01.2018" AND Zeit BETWEEN 00.00 AND 06.00)

    Leichter wäre es mit Timestamp - warum hast du denn Datum und Uhrzeit getrennt? Wozu ist das gut - bringt dir doch hierfür nur Ärger.

    Vielleicht kannst auch in der Abfrage Datum und Zeit zu einem Wert zusammenfügen und BETWEEN verwenden.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hallo zusammen.

    Besten Dank für euere Antworten.

    Bezüglich dem Typ datetime und dann nur Datum rein schreiben.... , (ich kürz ab) kann auf jede Seite geändert werden (entwerder mit date und nur datum oder die Zeit dazu) -> doch das im endeffekt egal - werde ich früher oder später mal anpassen.

    Bei all den netten Antworten habe ich noch nicht den Durchblick erhalten wie die Werte einer Nacht (die geht ja von Tag 1 um 22:00Uhr bis Tag 2 06:00) die Zeiten sind definiert... in die View kommen.

    Um allfälligen Fragezeichen vorzubeugen stelle formuliere ich an dieser Stelle meine Frage nochmals um. Um stelle ein Beispiel meine gewünschten ausgabe bei.

    Wie muss die View ausehen damit ich folgendes Ergebnis bei Select * from xxx_view erhalte:

    Nacht MinTemp MaxTemp

    1 (11.02.2017) 1 15

    2 (12.02.2017) 5 22

    .....

    Der Wert für Nacht kann das Datum der Uhrzeit 22Uhr sein (steht in Klammern)...

    Gruss

    Dani

  • Die Query als View zu formulieren ist simple...

    Hast du dir die (meine) SQL-Queries überhaupt mal angesehen und damit "rumgespielt"?

    Meine Query in #11 enthält die Lösung der Frage, die du formuliert hast (durch weglassen eines bestimmten Terms in der formulierten Query) .

    Ich bin allerdings nicht gewillt, dir die Hausaufgaben zu machen...

  • Sali Zentris.

    Wahrscheinlich habe ich Tomaten auf den Augen, falls dies zutrifft. Helft mir zu sehen.

    Doch bis jetzt erschliesst sich mir die Antwort noch nicht.

    Die Formulierung als View ist kein Problem, das stimmt.

    Durch weglassen eines Teils (theoretisch die Stunden) im Where Teil wird es nicht besser (weil dan immer der Tag gruppiert wird, jedoch will ich das ja genau nicht. es soll ja von 22 uhr bis 6uhr am nächsten Tag gruppiert werden.

    Gruss Dani

  • Sorry das ich jetzt erst was schreibe: Die Tabelle sieht mir nach "broken by design" aus...

    Lösch Datum und Zeit und setz stattdessen eine timestamp Spalte, dann ist alles weitere auch recht simpel. Mit nem Unix-Timestamp kann man IMHO sehr einfach arbeiten und je nach belieben umwandeln, alles just-in-time im Query.


    //EDIT: So wie ich das zB auch hier mache: https://github.com/meigrafd/HighCharts/blob/master/data.php

  • meigrafd :

    Das schrieb ich schon in #10, wo genau ist jetzt der Mehrwert deines Beitrags?

    An der eigentlichen Problemstellung/Lösung ändert das nichts.

    (Warum ich das schreibe? Von wenigen Tagen gab es einen Thread, den du ebenfalls beachtet hast, in welchem sich darum drehte, dass immer wieder Beiträge geschrieben werden, die einen schon zuvor erwähnten Fakt/Hinweis usw. mit anderen Worte nochmals bringen.

    Das hier ist wieder so etwas... )

  • Im Gegensatz zu deinem Beitrag#10 schreibe ich konkret "broken by design". Du schriebst auch etwas schwammig zu "timestamp", was selbst ich nicht verstanden habe was du damit eigentlich meinst:

    Deine "datum" Spalte sollte entweder vom Format "date" sein oder, wenn du "timestamp" so wie jetzt verwendest, auch die Uhrzeit enthalten

    Desweiteren zeige ich Code, wie einfach es mit "timestamp" dann werden könnte.

    Auch Gnom hat im Anschluss noch mal "timestamp" erwähnt, schreibt aber auch nichts konkretes - den meckerst du aber nicht an?

  • Ich gehe (immer) davon aus, dass mein(e) "Gegenüber" in fachlichen Gesprächen zumindest den Kontext verstehen...

    Wenn das (wie z.B. bei Einsteigern) nicht der Fall ist, sollte (in der Doku) nachgeschlagen oder (hier) nachgefragt werden.


    Da wir uns hier mit dem Thema "MySQL" bzw. Datenbanken beschäftigen, sollte der Begriff "timestamp" verstanden werden (Datentyp einer Tabellenspalte) - da ist nix schwammig... Was an meinem (von dir zitierten) Satz hast du denn nicht verstanden?

    Aus der vom TO gezeigten Tabelle geht hervor (Annahme!) , dass seine Spalte "Datum" den Typ "timestamp" hat..., allerdings hat er dort "nur" das Datum versorgt anstelle den Typ richtig zu verwenden (den gesamten Zeitstempel) ... Das ist es, was ich mit meinem von dir zitierten Text gesagt habe...

    BTW:

    Ich habe in meinen Tabellen häufig ebenfalls Datum und Zeit (als Datentypen) in getrennten Tabellenspalten:

    Das vereinfacht (verkürzt) oft die SQL-Queries und ist bei großen Datenmengen signifikant schneller (indizierte Spalten, Abfragen per "group by" bzw. "order by")

    Dein Beispiel (in PHP) hilft dem TO (vermutlich?) nicht all zu viel, da seine Kernfrage ja in der Ermittlung der min/max-Temperatur in einem ausgewählten Zeitbereich eines Tages betrifft und das als SQL (Wenn ich das per z.B. Python machen soll/kann, ist es viel einfacher..., und wenn als DB Influx verwendet wird, ist es geradezu simpel, da diese DB u.a. GENAU für solche Abfragen gemacht wurde...).

    Zu aller letzt:

    Den Beitrag von Gnom habe ich nicht "angemeckert" weil ich eigentlich überhaupt nicht "meckern" will/wollte und er zeitnah zu meinen Beitrag (nur wenige Sekunden) erschien... da konnte er noch gar nicht gelesen haben, dass ich da schon was geschrieben habe....

    Lass mal gut sein und uns wieder dem Thema des TOs zuwenden...

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!