Hlavní navigace

Názor k článku Datové typy v PostgreSQL pro práci s datem a časem od KarelE - A člověka ještě víc zmate, když zjistí, že...

  • Článek je starý, nové názory již nelze přidávat.
  • 28. 2. 2019 13:02

    KarelE

    A člověka ještě víc zmate, když zjistí, že jiné databáze to mají jinak. Tak kupříkladu Oracle:

    • datový typ DATE obsahuje datum i čas s přesností na sekundy. Má 7 bytů a interní ID 12
    • jiný datový typ, ovšem také pojmenovaný DATE, má 8 bytů. Interní ID 13
    • samostatné datové typy pro datum a čas neexistují. Pokud je chce emulovat pomocí DATE, tak bude kód zamořený funkcí TRUNC. V praxi je lepší je neemulovat a prostě se bez nich odejít. Případně použít jiný typ jako NUMBER nebo VARCHAR2 a ošéfovat si to ručně. Má osobní zkušenost je, že datum a čas odděleně jsou potřeba jen na exotiku typu "spustit každý den ve tři ráno"
    • datový typ TIMESTAMP obsahuje datum i čas. Oproti DATE umí i zlomky sekundy a to na 0 až 9 míst, takže teoreticky s přesností nanosekund. Přesnost určuje programátor a databáze ji "ráda ztrácí" při implicitních konverzích (protože když nezadáte přenost, tak je default 6)
    • zrada je ve funkcích typu SYSTIMESTAMP. Ta vrací čas z OS. Takže i když nastavíte přesnost na nanosekundy, tak skutečná přesnost bude jinde. V případě OS Windows vrací OS jen mikrosekundy. Oracle Linux vrací nanosekundy

    Rozdíl mezi DATE a DATE je v tom, že ten první je interní datový formát, zatímco ten druhý je hodnota vypočítaná nějakou funkcí. Takže sloupec typu DATE má 7 bytů a je to typ 12, zatímco výsledek funkce SYSDATE má 8 bytů a je to typ 13. Ten extra byte je "unused". Normální smrtelník nikdy nezjistí, že to jsou dva různé datové typy, Oracle je implicitně konvertuje. Jenže pokud potřebujete řešit věci kolem správy metadat, tak dříve nebo později narazíte na nesrovnalosti mezi verzemi Oracle způsobené tím, že na 12.1 se ve view ukáže typ 12, zatímco 12.2 reportuje typ 13, navíc s rozdílnou velikostí (7 vs 8 bytů).

    Na Oracle se dá datový typ zkoumat třebas takhle: select dump(sysdate) from dual