2016-05-13 13 views
0

Falscher Datetime-Wert: '2014-10-19 00:00:00' für die Spaltenzeit bei Zeile 2300Falscher Datetime-Wert: '2014-10-19 00:00:00' für die Spaltenzeit in Zeile 2300

Wie kann ich das beheben Abfrage falschen Datetime-Wert zu vermeiden SQL ersetzen: ‚2014.10.19 00.00.00‘ für die Spalte Zeit in Zeile 2300.

In Brasilien DST am Sonntag stattfindet, 19. Oktober 2014, 12.00.00 Mitternacht Uhren wurden um 1 Stunde bis Sonntag, 19. Oktober gedreht, 2014, 01.00.00 lokalen Sommerzeit statt und MYSQL-Server nicht nur nicht wie 2014.10.19 00.00 : 00 als nicht wirklich gültig Zeit, sollte es seine 2014-10-19 01:00:00

Mysql-Server auf O mit Zeitzone installiert (UTC-03: 00) Barasilia

CREATE TABLE `Table1` (
    `Group` bigint(20) unsigned NOT NULL, 
    `Type` enum('Electric_Energy','Electric_Apparent','Gas_Volume','Gas_Energy','Water_Volume','Water_Energy','Thermal_Energy','Steam_Weight','Temperature','Carbon_Emission','Fuel_Volume') COLLATE utf8_bin NOT NULL, 
    `Aggregation` enum('Sum','Avg','Max','Min') COLLATE utf8_bin NOT NULL, 
    `Period` char(1) COLLATE utf8_bin NOT NULL, 
    `Timestamp` timestamp NOT NULL, 
    `Value` decimal(38,10) NOT NULL, 
    PRIMARY KEY (`Group`,`Timestamp`,`Type`,`Aggregation`,`Period`), 
    KEY `IDX_Table1_group_period_timestamp` (`Group`,`Period`,`Timestamp`), 
    CONSTRAINT `FK_Table1_Group` FOREIGN KEY (`Group`) REFERENCES `group1` (`ID`) ON DELETE CASCADE ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=COMPRESSED; 




CREATE TABLE `Table2` (
    `ID` bigint(20) unsigned NOT NULL, 
    `Value` decimal(38,10) NOT NULL, 
    `Timestamp` timestamp NOT NULL, 
    PRIMARY KEY (`ID`,`Timestamp`), 
    CONSTRAINT `FK_Table2_ID` FOREIGN KEY (`ID`) REFERENCES `Table3` (`ID`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 







REPLACE INTO `Table1` SELECT 898 `Group`, "Water_Volume" `Type`, "Sum" `Aggregation`, "D" `Period`, CONCAT(DATE_FORMAT(`t1`.`Timestamp`, "%Y-%m-%d"), " 00:00:00") `Timestamp`,Sum(`t1`.`Value`) `Value` FROM (SELECT SUM(`Value`) `Value`, `Timestamp` FROM `Table2` WHERE `ID` IN (1438, 1439) AND `Timestamp` BETWEEN "2014-10-12 00:00:00" AND "2014-10-19 23:59:59" GROUP BY `Timestamp`) `t1` GROUP BY DATE_FORMAT(`t1`.`Timestamp`, "%Y-%m-%d"); 
+0

Es bezieht sich nicht auf Ihre eigentliche Frage, aber ich würde vorschlagen, dass, wenn Sie sicher sind Ihre Auswahlliste nicht ändern wird, oder werden vorbereitet, wenn sie es tun, würde ich Enum Felder vermeiden; Sie sind fast immer besser dran mit Verweisen auf Nachschlagetabellen. Wenn Sie einer Aufzählungsliste einen neuen Wert hinzufügen, muss MySQL die gesamte Tabelle neu erstellen. Außerdem haben sie in einigen Situationen ein merkwürdiges Verhalten und ihre Unterstützung durch verschiedene APIs kann fleckig sein. – Uueerdo

+0

Danke für Ihre schnelle Antwort. Ich frage Sie hier, wie SQL-Abfrage beheben Ersetzen falschen Datetime-Wert zu vermeiden: ‚2014.10.19 00.00.00‘ für die Spalte Zeit in Zeile 2300 – kphadke

+0

Ja, ich bin nicht sicher, wie MySQL, dass ein ungültiger Wert betrachten kann ... oder sagst du, dass das nicht der Wert ist, den du erwartest? Vielleicht braucht der CONCAT einen CAST? oder ist es möglich, dass beide table2 Datensätze denselben Wert für die 'Timestamp' Feld haben, was in ersetzen zu versuchen, die gleiche Zeile zweimal zu aktualisieren? – Uueerdo

Antwort

0

Ich weiß nicht, von einer offiziellen Art und Weise Sommerzeit-Löcher zu kompensieren, aber so etwas sollte einfach sein, einmalige Verwendung, Möglichkeit, damit umzugehen.

CONCAT(DATE_FORMAT(`t1`.`Timestamp`, "%Y-%m-%d") 
     , IF(DATE_FORMAT(`t1`.`Timestamp`, "%Y-%m-%d")="2014-10-19", " 01:00:00", " 00:00:00") 
    ) 

Wenn es nicht um zu Jahr aus Jahr nicht springen wie es sich anfühlt, wie es in den USA der Fall ist, könnten Sie wahrscheinlich mit einer dauerhafteren Test kommen wie

MONTH(`t1`.`Timestamp`) = 10 AND DAYOFMONTH(`t1`.`Timestamp`) = 19 

... oder einfach nur Verwenden Sie 01:00:00 einheitlich, da Sie sowieso an diesen Daten berücksichtigen/anpassen müssen.

Verwandte Themen