sql >> Databáze >  >> RDS >> Mysql

Převod záporných hodnot z FROM_UNIXTIME

Místo toho můžeme udělat toto:

FROM_UNIXTIME(0) + INTERVAL -957632400 SECOND

FROM_UNIXTIME funkce je omezena povoleným rozsahem pro TIMESTAMP datový typ, což je standardní 32bitový int rozsah bez znaménka 1970-01-01 až 2038-01-něco. Další software byl aktualizován, aby podporoval 64bitová celá čísla se znaménkem, ale MySQL zatím tuto funkci neposkytuje (alespoň ne ve verzi 5.1.x).

Řešením v MySQL je vyhnout se používání TIMESTAMP datový typ a pomocí DATETIME místo toho datový typ, když potřebujeme větší rozsah (např. data před 1. lednem 1970).

Můžeme použít DATE_ADD funkce k odečtení sekund od 1. ledna 1970 takto:

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

N.B. Při provádění těchto typů výpočtů budete pravděpodobně muset počítat s „posuny“ časového pásma od UTC. MySQL bude interpretovat hodnoty DATETIME jako hodnoty specifikované v time_zone nastavení aktuální relace MySQL, nikoli UTC (time_zone = '+00:00' )

NÁSLEDUJÍCÍ:

O: Dobře, znamená to, že pokud vybereme data pod '1970-01-01 00:00:00', pak se záporná hodnota uloží do db, jinak by byla kladná. Že jo? – soft genic

Odpověď: Uhhh, ne. Pokud vyberete hodnoty data/datetime před 1. lednem 1970, MySQL vrátí hodnoty DATE nebo DATETIME před 1. lednem 1970. Pokud uložíte hodnoty DATE nebo DATETIME před 1. lednem 1970, MySQL uloží hodnotu DATE nebo DATETIME před 1. lednem , 1970, v povoleném rozsahu podporovaném těmito datovými typy. (něco jako 0001-01-01 až 9999?)

Pokud potřebujete v databázi uložit opravdu velká kladná a záporná celá čísla, pravděpodobně je uložíte do sloupce definovaného jako BIGINT .

Interní reprezentace sloupce DATE vyžaduje 3 bajty úložiště a DATETIME vyžaduje 8 bajtů úložiště (až do verze MySQL 5.6.4. Interní reprezentace a úložiště hodnot DATE a DATETIME se změnilo v 5.6.4)

Takže ne, MySQL neukládá hodnoty data před rokem 1970 jako "záporná celá čísla".

Pokud se nad tím trochu zamyslíte, MySQL si může zdarma implementovat jakýkoli mechanismus úložiště, který chtějí. (A každý úložný stroj může tuto reprezentaci serializovat na disk, jak chce.)

Proč 3 bajty pro datum?

Jednou z možností, kterou MySQL má (a já netvrdím, že to je způsob, jakým se to dělá) by mohlo být rozdělit datum na komponenty rok, měsíc a den.

Reprezentace celočíselných hodnot v rozsahu - vyžaduje -

  • 0 - 9999 - 14 bitů

  • 0 - 12 - 4 bity

  • 0 - 31 - 5 bitů

To je celkem 23 bitů, což se náhodou vejde do 3 bajtů. To jen ukazuje, že není nutné, aby MySQL reprezentovalo hodnoty data před 1. lednem 1970 jako záporná celá čísla, takže bychom neměli předpokládat, že tomu tak je. (Ale o tuto úroveň detailů bychom se skutečně zabývali pouze tehdy, pokud bychom pracovali na úložném enginu pro MySQL.)



  1. Workflow UTF8 PHP, MySQL shrnuto

  2. Jak odstranit hodnotu typu enum v postgresu?

  3. Horních n procent horních n %

  4. mysql počítání řádků se smyčkou