Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Konvertieren negativer Werte von FROM_UNIXTIME

Wir können stattdessen Folgendes tun:

FROM_UNIXTIME(0) + INTERVAL -957632400 SECOND

Die FROM_UNIXTIME Die Funktion wird durch den zulässigen Bereich für TIMESTAMP begrenzt Datentyp, der der standardmäßige 32-Bit-Int-Bereich ohne Vorzeichen von 1970-01-01 bis 2038-01-etwas ist. Andere Software wurde aktualisiert, um 64-Bit-Ganzzahlen mit Vorzeichen zu unterstützen, aber MySQL bietet diese Funktionalität noch nicht (zumindest nicht in 5.1.x).

Die Problemumgehung in MySQL besteht darin, die Verwendung von TIMESTAMP zu vermeiden Datentyp und die Verwendung von DATETIME Datentyp stattdessen, wenn wir einen größeren Bereich benötigen (z. B. Daten vor dem 1. Januar 1970).

Wir können den DATE_ADD verwenden Funktion zum Subtrahieren von Sekunden vom 1. Januar 1970 wie folgt:

SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)

NB. Bei diesen Berechnungen müssen Sie wahrscheinlich Zeitzonen-"Offsets" von UTC berücksichtigen. MySQL interpretiert DATETIME-Werte als in time_zone angegeben Einstellung der aktuellen MySQL-Session statt UTC (time_zone = '+00:00' )

NACHVERFOLGUNG:

F: Okay, bedeutet, wenn wir Daten unter '1970-01-01 00:00:00' auswählen, wird der negative Wert in der Datenbank gespeichert, sonst wäre er positiv. Recht? – weiches Gen

A: Ähhh, nein. Wenn Sie date/datetime-Werte vor dem 1. Januar 1970 auswählen, gibt MySQL DATE- oder DATETIME-Werte vor dem 1. Januar 1970 zurück. Wenn Sie DATE- oder DATETIME-Werte vor dem 1. Januar 1970 speichern, speichert MySQL den DATE- oder DATETIME-Wert vor dem 1. Januar , 1970, innerhalb des zulässigen Bereichs, der von diesen Datentypen unterstützt wird. (etwas wie 0001-01-01 bis 9999 ?)

Wenn Sie wirklich sehr große positive und negative Ganzzahlen in der Datenbank speichern müssen, würden Sie diese wahrscheinlich in einer als BIGINT definierten Spalte speichern .

Die interne Darstellung einer DATE-Spalte erfordert 3 Bytes Speicherplatz und DATETIME benötigt 8 Bytes Speicherplatz (bis zu MySQL-Version 5.6.4. Die interne Darstellung und Speicherung von DATE- und DATETIME-Werten wurde in 5.6.4 geändert)

Also nein, MySQL speichert Datumswerte vor 1970 nicht als "negative Ganzzahlen".

Wenn Sie ein wenig darüber nachdenken, steht es MySQL frei, jeden beliebigen Speichermechanismus zu implementieren. (Und jeder Speicher-Engine steht es frei, diese Darstellung nach Belieben auf die Festplatte zu serialisieren.)

Warum 3 Byte für ein Datum?

Eine Option, die MySQL hat (und ich behaupte nicht, dass dies so gemacht wird), könnte darin bestehen, das Datum in seine Komponenten Jahr, Monat und Tag aufzuteilen.

Die Darstellung ganzzahliger Werte im Bereich - erfordert -

  • 0 - 9999 - 14 Bit

  • 0 - 12 - 4 Bit

  • 0 - 31 - 5 Bit

Das sind insgesamt 23 Bits, was praktischerweise in 3 Bytes passt. Dies zeigt nur, dass es für MySQL nicht notwendig ist, Datumswerte vor dem 1. Januar 1970 als negative Ganzzahlen darzustellen, also sollten wir nicht davon ausgehen, dass dies der Fall ist. (Aber wir würden uns wirklich nur mit diesem Detaillierungsgrad befassen, wenn wir an einer Speicher-Engine für MySQL arbeiten würden.)