Einzelnen Beitrag anzeigen
  #1  
Alt 21.05.2018, 11:05:47
AlexD AlexD ist offline
Junior Member
 
Registriert seit: Jun 2003
Beiträge: 186
mehrere Tabellen über Timestamp abfragen

Hallo zusammen,

ich brauch mal wieder Eure Hilfe bzw. Rat.
Wie in der oben schon genannt möchte ich ein Query über 4 Tabellen mit dem Timestamp als gemeinsame Basis.

An und für sich ist das kein Problem, jedoch sind die Timestamps der einzelnen Tabellen NICHT synchron und unterscheiden sich jeweils im Sekundenbereich.


Worum geht es:
Ich hab mir ein kleines Monitoring für mein Haus erstellt und möchte nun die Daten entsprechend auswerten.
Im speziellen Fall geht es um die Daten vom Strom und Heizungsschaltung in Verbindung mit der PV-Anlage.
Um in etwa sagen zu können wie und wann ist die Heizung im PV-Modus gelaufen und wieviel musste ich wirklich Heizstrom einkaufen.

Heizung und Stromzähler werden im "MINUTEN-TAKT" mitgeloggt und die Daten direkt oder einmal am Tag das Logfile in die Datenbank übertragen.
Dadurch befinden sich in jeder Tabelle ca. 500.000 Datensätze und tägl. kommen 1440 pro Tabelle hinzu.

Leider sind die Timestamps nicht Sekundengleich.
Ich brauch auch keine Sekundengleiche Abfrage, wenn diese auf die Minute ist reicht mir das auch!!

Ich habe zwar ein Query das soweit funktioniert, nur braucht es fast 4 Minuten bis ein Ergebnis kommt.
In dem Query wird quasi die Differenz zweier Timestamps gebildet und wenn diese unter 1 Minute ist.... Treffer.
Aber ich denke er muss von jeder Tabelle jedesmal alle gut 500.000 Datenzästze abgleichen und das dauert dann eben eine Ewigkeit.

Hier mal die Abfrage:
PHP-Code:
// Datum der Form dd.mm.yyyy umwandeln in YYYY-mm-dd
    
if($von !== NULL && $bis !== NULL){

        
$vondatum_split explode(".",$von);
        
$vondatum $vondatum_split[2]."-".$vondatum_split[1]."-".$vondatum_split[0];

        
$bisdatum_split explode(".",$bis);
        
$bisdatum $bisdatum_split[2]."-".$bisdatum_split[1]."-".$bisdatum_split[0];
        
        
$zeitraum " heizung_webdaten.timestamp
                       BETWEEN  '"
.$vondatum."' AND '".$bisdatum."'";
    } elseif (
$jahr !== NULL){

        
$zeitraum " YEAR(heizung_webdaten.timestamp) = ".$jahr."";
    }

    
$sql_query "SELECT heizung_webdaten.*, strom_heizungsdaten.timestamp AS timestamp_strom, strom_heizungsdaten.WirkenergieSigmaL_imp, strom_hausdaten.WirkleistungSigmaL
                    FROM heizung_webdaten, strom_heizungsdaten, strom_hausdaten
                    WHERE "
.$zeitraum."
                     AND heizung_webdaten.wp_status = 12
                     AND ABS(UNIX_TIMESTAMP(heizung_webdaten.timestamp) - UNIX_TIMESTAMP(strom_heizungsdaten.timestamp)) < 59
                     AND ABS(UNIX_TIMESTAMP(heizung_webdaten.timestamp) - UNIX_TIMESTAMP(strom_hausdaten.timestamp)) < 59

                ORDER BY heizung_webdaten.timestamp"
;
    echo 
$sql_query."<br>";
    
    
$result $mysqli->query($sql_query);
    echo 
$mysqli->error;
    while(
$daten $result->fetch_assoc()){

        echo 
$daten['timestamp']." : ".$daten['wp_status']." => HZG-Strom_Daten: ".$daten['timestamp_strom']." ->  ".$daten['WirkenergieSigmaL_imp']."kWh |  akt. Verbrauch:".$daten['WirkleistungSigmaL']." kW<br>";
    } 
P.S.: die Ausgabe in der Schleife ist nur dazu da um zu sehen ob das Query ein Ergebnis bringt und hat nix mit der Auswertung zu tun.

Hoffe Ihr könnt mir hier ein wenig auf die Sprünge helfen

Grüße
Alex
Mit Zitat antworten