Archivabfrage - falsche "Duration" im aktuellen Zeitraum

Hallo,

ich habe ein Problem bei der Auswertung oder dem Auslesen von aggregierten Archivwerten. Der letzte Zeitraum, der eigentlich bis 31.12.2020 23:59:59 gehen sollte, geht nun immer bis zum aktuellen Zeitstempel.

Hier mal ein Code-Beispiel:


$Archiv_ID          = 45343;

//auszuwertende Variablen
$W_Bezug_Gesamt     = 41089;
$W_Lieferung_Gesamt = 50743;

$StartTime  = mktime(0, 0, 0, 1, 1, 2018);  
$EndTime    = mktime(0, 0, 0, 1, 1, 2021)-1;

$werte_Bez = AC_GetAggregatedValues($Archiv_ID, $W_Bezug_Gesamt,     4, $StartTime, $EndTime, 0);        
$werte_Lie = AC_GetAggregatedValues($Archiv_ID, $W_Lieferung_Gesamt, 4, $StartTime, $EndTime, 0);        

$StartDate  = array();
$EndDate  = array();

foreach($werte_Bez as $wert)
   {
    $StartDate[]  = date("d.m.Y H:i:s", $wert['TimeStamp']);
    $EndDate[]    = date("d.m.Y H:i:s", ($wert['TimeStamp'] + $wert['Duration']));
   } 
   
$LengthTable = count($StartDate);
   
$Table[0] = array_merge(array('Startdatum + Uhrzeit'), $StartDate);
$Table[1] = array_merge(array('Enddatum + Uhrzeit'),   $EndDate);
$Table[2] = array_merge(array('Bezug Gesamt'),     array_column($werte_Bez, 'Avg'));
$Table[3] = array_merge(array('Lieferung Gesamt'), array_column($werte_Lie, 'Avg'));

$Spalten = count($Table);

$Text = PHP_EOL;    
for ($line=0; $line<$LengthTable; $line++)
{
    for ($col=0; $col<$Spalten; $col++)
    {
        if ($col < ($Spalten-1))
            {
               $Val = $Table[$col][$line];
            $Text = $Text.strval($Val)."	";
            }
        else    
            {
                $Val = $Table[$col][$line];
             $Text = $Text.strval($Val); // letzte Spalte
            }
    }
    $Text = $Text.PHP_EOL;
}    

var_dump($Text);

Das Ergebnis ist folgendes:


Startdatum + Uhrzeit    Enddatum + Uhrzeit    Bezug Gesamt    Lieferung Gesamt
01.01.2020 00:00:00    07.01.2021 19:59:36    3123.564    3915.525
01.01.2019 00:00:00    01.01.2020 00:00:00    2984.182    3831.093

kann mir jemand sagen, was ich falsch mache?

viele Grüße
cervicor

Hat keiner eine Idee?

viele Grüße
cervicor

Hallo,

offensichtlich, war meine Anfrage nicht spezifisch genug. Hier noch mal Ergebnisse weiterer Tests. Bei einem neuen Test fand ich folgendes Verhalten bei einem einfachen Abfragescript:


<?
$ArcValues = AC_GetAggregatedValues(45343, 41089, 4, mktime( 0, 0, 0, 1, 1, 2019), mktime(0, 0, 0, 1, 1, 2021), 0);        

foreach($ArcValues as $ValueSet)
   {
    echo date("d.m.Y H:i:s",  $ValueSet['TimeStamp'])."	";
    echo date("d.m.Y H:i:s", ($ValueSet['TimeStamp'] + $ValueSet['Duration']-1))."	";
    echo sprintf("%01.5f", $ValueSet['Avg'])."
";
   } 
?>

Als Ergebnis bekam ich folgende Ausgabe:


01.01.2021 00:00:00    09.01.2021 18:02:49    216.77700
01.01.2020 00:00:00    31.12.2020 23:59:59    3123.56400
01.01.2019 00:00:00    31.12.2019 23:59:59    2984.18200

Hier hätte ich erwartet, dass die oberste Zeile nicht vorhanden ist, da das Enddatum ja hier auf dem 01.01.2021 liegt.

Übrigens, auch bei monatlicher Aggregation (im Script einfach die 4 auch eine 3 ersetzen), ist die erste Zeile vorhanden.

viele Grüße
cervicor

PS: ich hatte in mtkime erst Monat und Tag vertauscht. Mit der aktuell eingegebenen Werten ist das Ergebnis aber wie gezeigt.

Hallo cervicor,

ich glaube du hast da einen Fehler im Archiv gefunden. Die Duration wird bei der Abfrage live berechnet. Wenn kein folgender Wert mit abgefragt wird, dann wird fälschlicherweise die Duration bis jetzt genommen anstatt bis zum nächsten nicht mit abgefragten Wert. Da kümmere ich mich drum. Danke für das Feedback!

Zum zweiten Punkt: In der Abfrage werden Werte mit aufgenommen, sobald der Startwert innerhalb des Intervalls ist. Wenn du also bis inklusive dem 1.1.2020 00:00:00 abfragst, dann bekommst du auch den aggregierten Wert für 2020, da dies ja der dazugehörige Starttermin ist.

Hallo Dr. Niels,

Danke für die Antwort. Das habe ich soweit verstanden.

Ich werde also meine Abfrage erstmal mit dem 01.01. enden lassen, und dann manuell das unvollständige Intervall in meiner weiteren Auswertung in Excel manuell löschen bis der Fehler behoben ist. Dann setze ich den Endezeitpunkt eine Sekunde früher.

Ich hatte den Hinweis in der Doku falsch verstanden:

Es werden immer ganze aggregierte Zeiträume abgefragt. Dafür muss der Startzeitpunkt (abhängig von der Aggregationsstufe) der/des Stunde/Tages/Woche/Monats/Jahr im Zeitraum von Startzeit und Endzeit umfasst sein.

Ich dachte, dass auch wenn ich den Endzeitpunkt z.B. auf Februar 2021 setze nur der ganze Zeitraum bis zum Ende des letzten Jahren ausgewertet wird.

viele Grüße
Oliver

Da ich momentan viel mit dem Archiv arbeite, wollte ich auch gerade den Bug melden, dass die Duration des letzten abgefragten Werts immer bis zur aktuellen Uhrzeit geht, anstatt bis zum nachfolgenden nichtabgefragten Wert (sofern vorhanden). Aber da ist mir @cervicor wohl zuvor gekommen. :grinning:

@Dr.Niels Ist schon absehbar, wann der Fix dafür kommt? Die Bug-Meldung ist ja schon etwas her. Aber keinen Stress, gibt sicher dringenderes. :wink:

Gruß
Slummi

@Dr.Niels Ich hatte diesen Fehler schon ganz verdrängt, bin aber aktuell wieder drüber gestolpert und es hat mich viel Zeit gekostet, bis ich darauf gekommen bis, dass es ihn scheinbar immer noch gibt.

Ich frage Werte mit AC_GetLoggedValues() ab und beim letzten Wert der Abfrage, also dem ersten Element des Arrays geht die Duration weiterhin bis zum letzten geloggten Wert. Hast du vor das noch zu fixen? Sonst muss ich mir irgendwie einen Workaround basteln.

Ich ärgere mich gerade selbst, dass ich erneut auf den Fehler rein gefallen bin, den ich gedanklich schon abgehakt hatte.

Oh, das ist tatsächlich einfach untergegangen. Zur ersten Stable 9.0 kommt wohl kein Fix mehr, aber ich mache mich da mal ran :+1: Danke fürs Nachhaken

Edit: Ich habe gerade nochmal selbst getestet. Bei meiner Test-Variablen klappt das wie gewünscht:


Hier einmal die Abfrage mit allen (zwei) Werten. Wir sehen der ältere Wert hat eine Dauer von 5 Sekunden, der neuere Wert ist bis Jetzt. Absolut korrekt, er wurde danach nicht mehr geändert.

Frage ich nur den älteren Wert ab bleibt die Dauer korrekterweise bei 5.

Ich möchte nicht ausschließen, dass es Konstellationen gibt, in denen die Dauerberechnung fehlschlägt, aber in meinem Beispiel sieht das schonmal gut aus. Magst du vielleicht nochmal prüfen, ob die Dauer tatsächlich auch in der aktuellen 9.0 nicht korrekt ausgewertet wird? Falls es nicht richtig ist, dann zeige am besten mal dein Skript, dann schauen wir mal, was da anders ist.