Update-Query auf Datetime. Wie?

gondor

Mitglied
hallo!

ich habe einfach keinen rat mehr. schon seit stunden probiere ich eine lösung zu finden, doch scheitert es es einach an meine basics. deswegen würde ich mir gerne den rat eines experten holen ;)

das problem:

ich lese ein file in mysql mit:

Code:
LOAD DATA LOW_PRIORITY LOCAL INFILE 'c:/sensoren.lvm' 
INTO TABLE test IGNORE 21 LINES (db_date_time, 
db_measurement_time, db_Value_0, db_value_1, db_value_2);

dabei enstehen folgende zeilen (spalte 1 index, 4-6 messwerte):

1 | 0000-00-00 00:00:00 | 0 | 21 | 22 | 23
2 | 0000-00-00 00:00:00 | 1 | 21 | 22 | 23
3 | 0000-00-00 00:00:00 | 3 | 21 | 22 | 23
4 | 0000-00-00 00:00:00 | 5 | 21 | 22 | 23

da die 2. spalte ein datetime ist, und die 3. spalte der momentane zeitwert der messung in sekunden, möchte ich den zeitwert auf den datetime draufaddieren. also so:

1 | 2004-05-01 14:04:56 | 0 | 21 | 22 | 23
2 | 2004-05-01 14:04:17 | 1 | 21 | 22 | 23
3 | 2004-05-01 14:04:59 | 3 | 21 | 22 | 23
4 | 2004-05-01 14:05:01 | 5 | 21 | 22 | 23

welchen update-befehl muss ich anwenden, wenn der startwert 2004-05-01 14:04:56 ist?

danke für hilfe!
 
Zuletzt bearbeitet:
ha, doch noch selbst gelöst :D

Code:
UPDATE test set db_date_time = date_add('2004-05-01 14:04:56', INTERVAL db_measurement_time SECOND) ;

sollte so richtig sein...

gondor(..)
 
jetzt habe ich nun doch noch ein problem damit:

leider habe ich in der 3.spalte mehrere 0-durchgänge, so dass die zahl kleiner ist, als davor. mit meinem befehlt addiert er nur die zeit auf einen startwert. d.h. bei einem 0-durchgang wird dieser verfälscht. wie bekomme ich die query so geändert, dass ich den zeitwert (3.spalte) immer auf den letzten datetime-wert (2.spalte) addiere, um den neuen datetime-wert zusetzen?

aussgangssituation:

1 | 0000-00-00 00:00:00 | 0 | 21 | 22 | 23
2 | 0000-00-00 00:00:00 | 1 | 21 | 22 | 23
3 | 0000-00-00 00:00:00 | 3 | 21 | 22 | 23
4 | 0000-00-00 00:00:00 | 5 | 21 | 22 | 23

query von oben:

1 | 2004-05-01 14:04:56 | 0 | 21 | 22 | 23
2 | 2004-05-01 14:04:57 | 1 | 21 | 22 | 23
3 | 2004-05-01 14:05:00 | 3 | 21 | 22 | 23
4 | 2004-05-01 14:05:05 | 5 | 21 | 22 | 23
5 | 2004-05-01 14:04:59 | 3 | 21 | 22 | 23
6 | 2004-05-01 14:05:04 | 5 | 21 | 22 | 23
7 | 2004-05-01 14:05:11 | 7 | 21 | 22 | 23

so sollte es aber sein:

1 | 2004-05-01 14:04:56 | 0 | 21 | 22 | 23
2 | 2004-05-01 14:04:57 | 1 | 21 | 22 | 23
3 | 2004-05-01 14:05:00 | 3 | 21 | 22 | 23
4 | 2004-05-01 14:05:05 | 5 | 21 | 22 | 23
5 | 2004-05-01 14:05:08 | 3 | 21 | 22 | 23
6 | 2004-05-01 14:05:13 | 5 | 21 | 22 | 23
7 | 2004-05-01 14:05:20 | 7 | 21 | 22 | 23

ich hoffe euch nun nicht verwirrt zu haben ;)

gondor(..)
 
Zuletzt bearbeitet:
so, jetzt habe ich das problem gelöst :D doch mit der anzahl der schleifen bei ca. 30.000 zeilen schwindet die geschwindigkeit, das netzwerk verursacht hohen traffic und sowieso ist mir alles vieeeel zu langsam. deswegen würde ich gerne wissen, ob der code noch optimiert werden kann.

vllt. gibt es ja noch andere query-abfragen, die sinnvoller sind...?

noch einmal die tabelle

1 | 2004-05-01 14:04:56 | 0 | 21 | 22 | 23
2 | 0000-00-00 00:00:00 | 2 | 21 | 22 | 23
3 | 0000-00-00 00:00:00 | 4 | 21 | 22 | 23
4 | 0000-00-00 00:00:00 | 6 | 21 | 22 | 23
5 | 0000-00-00 00:00:00 | 1 | 21 | 22 | 23 <- 0 durchgang
6 | 0000-00-00 00:00:00 | 3 | 21 | 22 | 23
7 | 0000-00-00 00:00:00 | 5 | 21 | 22 | 23
7 | 0000-00-00 00:00:00 | 7 | 21 | 22 | 23
9 | 0000-00-00 00:00:00 | 2 | 21 | 22 | 23 <- 0 durchgang
10| 0000-00-00 00:00:00 | 4 | 21 | 22 | 23
11| 0000-00-00 00:00:00 | 6 | 21 | 22 | 23

nach anwendung des codes:

1 | 2004-05-01 14:04:56 | 0 | 21 | 22 | 23
2 | 2004-05-01 14:04:58 | 2 | 21 | 22 | 23
3 | 2004-05-01 14:05:00 | 4 | 21 | 22 | 23
4 | 2004-05-01 14:05:02 | 6 | 21 | 22 | 23
5 | 2004-05-01 14:05:03 | 1 | 21 | 22 | 23 <- 0 durchgang
6 | 2004-05-01 14:05:05 | 3 | 21 | 22 | 23
7 | 2004-05-01 14:05:07 | 5 | 21 | 22 | 23
7 | 2004-05-01 14:05:09 | 7 | 21 | 22 | 23
9 | 2004-05-01 14:05:10 | 2 | 21 | 22 | 23 <- 0 durchgang
10| 2004-05-01 14:05:12 | 4 | 21 | 22 | 23
11| 2004-05-01 14:05:14 | 6 | 21 | 22 | 23

berechnet wird die date-time über die differenz der werte aus spalte 3. zu beachten ist, dass 0-durchgänge anders behandelt werden müssen...

nun der code:

Code:
      /*Datum in die ersten Zeile setzen*/
      String query_31 = "UPDATE " + DB_TABLE_NAME_ + " set " + DB_DATE_TIME_ + " = date_add('" + startTime_ + "', INTERVAL " + 0 + " SECOND) WHERE db_id = 1 ;";
      arc_sql.getResultMySQLUpdate(query_31);

      System.out.println("+anfangen++++++++++++++++++++++++++++++++++++++++++++++++++++");

      for (int i = 1; i < 20000; i++){

        System.out.println(i);

        /*ersten Wert lesen*/
        String query_15 = "Select db_measurement_time From " + DB_TABLE_NAME_ + " Where db_id = " + i + ";";
        DB_MEASUREMENT_TIME_TEMP = arc_sql.getResultMySQLQueryAdd(query_15);

        i++;

        /*nächsten Wert lesen*/
        String query_2 = "Select db_measurement_time From test Where db_id = " + i + ";";
        DB_MEASUREMENT_TIME = arc_sql.getResultMySQLQueryAdd(query_2);

        /*Differenz*/
        int DB_DELTA_MEASUREMENT_TIME = DB_MEASUREMENT_TIME - DB_MEASUREMENT_TIME_TEMP;

        i--;

        /*Letzten Zeitwert nehmen...*/
        String query_5 = "Select " + DB_DATE_TIME_ + " From " + DB_TABLE_NAME_ + " Where db_id = " + i + ";";
        arc_sql.getResultMySQLQueryDate(query_5);
        startTime_ = arc_sql.getResultMySQLQueryDate(query_5);

        i++;

        if (DB_DELTA_MEASUREMENT_TIME == 30){

          //System.out.println("kein zero crossover+++++++++++++++++++++++++++++++++++++++++++++");

          /*... und die Differenzzeit bei keinem 0-Durchgang addieren*/
          String query_3 = "UPDATE " + DB_TABLE_NAME_ + " set " + DB_DATE_TIME_ + " = date_add('" + startTime_ + "', INTERVAL " + DB_DELTA_MEASUREMENT_TIME + " SECOND) WHERE db_id = " + i + " ;";
          arc_sql.getResultMySQLUpdate(query_3);

        } else {

          //System.out.println("zero crossover+++++++++++++++++++++++++++++++++++++++++++++");

          /*... und 1 Sekunde bei 0-Durchgang addieren*/
          String query_3 = "UPDATE " + DB_TABLE_NAME_ + " set " + DB_DATE_TIME_ + " = date_add('" + startTime_ + "', INTERVAL 1 SECOND) WHERE db_id = " + i + " ;";
          arc_sql.getResultMySQLUpdate(query_3);
        }

        i--;

        }

also, was ist zu tun bei solchen problemen?

gondor(..)
 
Zuletzt bearbeitet:
Zurück