![]() |
AW: Verdichtungstabellen für Messwertarchiv erstellen
Die Optimierung (das Wort ist da durchaus hoch gegriffen, es sollte "Verbesserung" heißen) ist nicht Teil meines Projektes. Der Kunde will nachher lediglich sagen können: Aha, Betrieb 2 darf nicht gleichzeitig Produkt A herstellen wenn Betrieb 7 Produkt B fährt, weil sonst Verbrauchsspitzen möglich. Viel feiner und vollautomatisch gehts auch kaum, da man sonst ja komplett in die Prozesssteuerung mit eingreifen müsste.
Ich habe gerade ein anderes Problem! Die Lösung von DejanVu scheint mir mit DateTime Werten im Delphi-Stil zu rechnen. In MySQL gibt es aber nur DATETIME und TIMESTAMP, wobei beide beim Nutzen von arithmetischen Operationen folgendermaßen behandelt werden: Ein Datumswert: '2015-08-06 12:55:43' wird mit
SQL-Code:
zu 20150806125543.0000
SELECT (NOW() / 1.0)
Es wird also eher quasi "optisch" konvertiert, und der Vorkommaanteil ist so ja kaum auf das Format "Anzahl Tage seit X" zu bringen. Hat da wer eine Idee? Edit: Okay, das hier scheint zu gehen
SQL-Code:
Das werde ich dann aber wohl als Function anlgegen müssen, sonst wird das Statement ein wilder Wust.
SELECT ((UNIX_TIMESTAMP(NOW()) / 86400.0) + 25569.0) as DelphiFormattedTime
|
AW: Verdichtungstabellen für Messwertarchiv erstellen
Nein, so ist das dort nicht, denn schau dir die Zahl einmal genauer an:
Code:
;)
20150806125543.0000
2015-08-06 12:55:43 |
AW: Verdichtungstabellen für Messwertarchiv erstellen
Zitat:
|
AW: Verdichtungstabellen für Messwertarchiv erstellen
Sehe ich eigentlich nicht so mit dem Wust
SQL-Code:
CREATE TABLE messInt ( IntID INT, IntSec INT );
INSERT INTO messInt ( IntID, IntSec ) VALUES (1,1), (2,60), (3,15*60), (4,60*60); CREATE TABLE messDat ( messID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, messDate DATETIME ); INSERT INTO messDat ( messDate ) VALUES ( '2015-08-08 12:59:59' ), ( '2015-08-08 13:00:00' ), ( '2015-08-08 13:00:01' ), ( '2015-08-08 13:14:59' ), ( '2015-08-08 13:15:00' ), ( '2015-08-08 13:15:01' ), ( '2015-08-08 13:29:59' ), ( '2015-08-08 13:30:01' ); SELECT messDat.*, messInt.*, FROM_UNIXTIME( ( UNIX_TIMESTAMP( messDat.messDate ) DIV messInt.IntSec ) * messInt.IntSec ) AS intDate FROM messDat, messInt; |
AW: Verdichtungstabellen für Messwertarchiv erstellen
Den Wust würde es bei der Verwendung o.g. Formel geben, wenn ich das mit dem Statement von DejanVu einsetzen würde. Klammerwald.
Das mit dem Datum als Zahl hatte ich schon verstanden, deswegen ergab sich ja die Frage nach einer entsprechenden Umwandlung die arithmetisch arbeitet, und nicht stumpf die Ziffern ohne Delimiter in eine Zahl schmeißt. (Wer braucht so ein blödes Format überhaupt!? Da kann man doch nix mit machen! (Ausser vergleichen, okay.)) |
AW: Verdichtungstabellen für Messwertarchiv erstellen
SirRufo, dein SELECT da schaut interessant aus! Eine komische Sache bekomme ich dabei aber bei täglichen Intervallen:
SQL-Code:
liefert:
SELECT i.Interval, FROM_UNIXTIME( ( UNIX_TIMESTAMP( h.mDate ) DIV i.Interval ) * i.Interval ) AS intDate from history h join intervals i
Man beachte, dass beim Raster von 86400 Sekunden die Uhrzeit 02:00:00 herauskommt, nicht wie ich gerne hätte 00:00:00. Woran liegt das? |
AW: Verdichtungstabellen für Messwertarchiv erstellen
Das riecht nach UTC -> MESZ Umwandlung.
|
AW: Verdichtungstabellen für Messwertarchiv erstellen
Yessssssssssss!
Ich glaube mit dem folgenden INSERT ist genau das gewünschte erledigt! Ein Aufruf für alle Intervalle. Boah ist das hübsch!
SQL-Code:
(Der PK liegt auf mID, mIntervalID, mDate.)
INSERT INTO history (mID, mIntervalID, mDate, mAVG, mMAX, mMIN, mAVGCount)
( SELECT :messID as mID, id AS IntervalID, FROM_UNIXTIME((UNIX_TIMESTAMP(:messDatum) DIV i.Interval) * i.Interval) AS messDatum, :messWert AS messWertAVG, :messWert AS messWertMAX, :messWert AS messWertMIN, 1 AS mAVGCount FROM intervals i ) ON DUPLICATE KEY UPDATE mAVG = (mAVG*mAVGCount + :messWert) / (mAVGCount + 1.0), mMAX = IF(mMAX > :messWert, mMAX, :messWert), mMin = IF(mMIN < :messWert, mMIN, :messWert), mAVGCount = mAVGCount + 1; Die Spaltennamen im Sub-Select könnten natürlich entfallen, das habe ich nur für mich beim Ausprobieren gemacht. Sehr super! Ich danke euch!! Das war Kollaboration wie sie Freude macht :) SirRufo's Roter Kasten: Wie könnte ich das am besten behandeln? Gibt es da entsprechende Funktionen die mir das automatisch ausgleichen könnten? |
AW: Verdichtungstabellen für Messwertarchiv erstellen
Zitat:
![]() |
AW: Verdichtungstabellen für Messwertarchiv erstellen
Tja ... das ist jetzt so eine Sache mit dem Zeitpunkt.
Ein Datensatz, der um 11:34:45 in Deutschland erstellt wurde und dann in Timbuktu eine Abfrage erstellt wird, was denn alles im Zeitraum 11:00:00-12:00:00 passiert ist ... der darf diesen Datensatz nicht sehen (bzw. es kommt eben darauf an, welches 11:00:00-12:00:00 er meint, lokale Zeit oder UTC-Zeit). Die Lösung heisst, dass du alle Werte in der Datenbank als UTC speicherst und vor jeder Abfrage die Zeitpunkte immer von lokal nach UTC umwandelst |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz