sql >> Database teknologi >  >> RDS >> Mysql

Konverterer negative værdier fra FROM_UNIXTIME

Vi kan gøre dette i stedet:

FROM_UNIXTIME(0) + INTERVAL -957632400 SECOND

FROM_UNIXTIME funktion er begrænset af det tilladte interval for TIMESTAMP datatype, som er standard 32-bit usigneret int-interval 1970-01-01 til 2038-01-noget. Anden software er blevet opdateret til at understøtte 64-bit signerede heltal, men MySQL leverer endnu ikke den funktionalitet (i hvert fald ikke i 5.1.x).

Løsningen i MySQL er at undgå at bruge TIMESTAMP datatype og bruge DATETIME datatype i stedet, når vi har brug for et større interval (f.eks. datoer før 1. januar 1970).

Vi kan bruge DATE_ADD funktion til at trække sekunder fra 1. januar 1970, sådan her:

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

NB Du skal sandsynligvis tage højde for tidszone-"forskydninger" fra UTC, når du udfører disse typer beregninger. MySQL vil fortolke DATETIME-værdier som værende angivet i time_zone indstilling af den aktuelle MySQL-session i stedet for UTC (time_zone = '+00:00' )

OPFØLGNING:

Sp: Okay, betyder, at hvis vi vælger datoer under '1970-01-01 00:00:00', så gemmer den negative værdi i db'en, ellers ville den være positiv. Ret? – blød genisk

A: Øhhh nej. Hvis du vælger dato-/datotidsværdier før 1. januar 1970, vil MySQL returnere DATE- eller DATETIME-værdier før 1. januar 1970. Hvis du gemmer DATE- eller DATETIME-værdier før 1. januar 1970, vil MySQL gemme DATE- eller DATETIME-værdier før 1. januar , 1970, inden for det tilladte område, der understøttes af disse datatyper. (noget i stil med 0001-01-01 til 9999?)

Hvis du har brug for at gemme virkelig store positive og negative heltal i databasen, vil du sandsynligvis gemme dem i en kolonne defineret som BIGINT .

Den interne repræsentation af en DATE-kolonne kræver 3-bytes lagring, og DATETIME kræver 8-bytes lagring (op til MySQL version 5.6.4. Den interne repræsentation og lagring af DATE- og DATETIME-værdier ændret i 5.6.4)

Så nej, MySQL gemmer ikke datoværdier før 1970 som "negative heltal".

Hvis du tænker lidt over det, er MySQL fri til at implementere hvilken lagringsmekanisme de ønsker. (Og hver lagermotor er fri til at serialisere denne repræsentation til disk, som den vil.)

Hvorfor 3 bytes for en date?

En mulighed MySQL har (og jeg repræsenterer ikke, at det er den måde, det gøres på) kunne være at dele datoen op i dets år, måned og dag.

Repræsentationen af ​​heltalsværdier i området - kræver -

  • 0 - 9999 - 14 bit

  • 0 - 12 - 4 bit

  • 0 - 31 - 5 bit

Det er i alt 23 bits, som tilfældigvis passer ind i 3 bytes. Dette viser blot, at det ikke er nødvendigt for MySQL at repræsentere datoværdier før 1. januar 1970 som negative heltal, så vi bør ikke antage, at det gør. (Men vi ville egentlig kun være bekymrede over dette detaljeringsniveau, hvis vi arbejdede på en storage-motor til MySQL.)



  1. Hvordan udtrækkes kun kolonner, der ikke har nul-værdier i mysql og php?

  2. Hvordan gemmer man brugers tidszone i mysql?

  3. Django kunne ikke finde MySQLdb python-modulet

  4. Er forberedte udsagn cachelagret på serversiden på tværs af flere sideindlæsninger med PHP?