sql >> Databáze >  >> RDS >> Oracle

SQL- Rozdíl mezi ČASOVOU RAZÍTKOU, DATEM A ČASOVOU RAZÍTKOU S ČASOVÝM PÁSEM?

Datové typy a rozdíly mezi nimi jsou v dokumentaci . Krátká verze je:

  • DATE má přesnost až na sekundu bez podpory časového pásma;
  • TIMESTAMP má přesnost až na zlomky sekundy (až na devět desetinných míst, ale ovlivňuje to i váš operační systém), stále bez podpory časového pásma;
  • TIMESTAMP S TIME ZONE má stejnou přesnost jako TIMESTAMP, ale také podporuje časové pásmo, jak název napovídá;
  • TIMESTAMP WITH LOCAL TIME ZONE upravuje uloženou hodnotu do a z místního časového pásma relace vytváření/dotazování.

Možná najdete tento článek také zajímavé.

Kdykoli porovnáváte hodnoty datetime uložené ve vaší databázi, měli byste k porovnání použít hodnoty stejného datového typu. Nechcete převádět každou hodnotu ve sloupci pro porovnání, zvláště pokud je sloupec indexován. Pokud máte sloupec DATE, porovnejte s DATE – neporovnávejte jako řetězec a nespoléhejte na implicitní konverze struny. Když to uděláte:

WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'

spoléháte na to, že váš NLS_DATE_FORMAT je DD-MON-YYYY a váš NLS_DATE_LANGUAGE je angličtina. Pokud někdo jiný spustí stejný dotaz v jiné relaci, jeho nastavení může způsobit selhání dotazu (nebo v některých případech poskytnout nesprávné výsledky, což může být horší). Abyste se vyhnuli jazykovým problémům, je lepší používat spíše čísla měsíců než jména. Pokud máte řetězcovou proměnnou k porovnání, měli byste použít TO_DATE() převést řetězec na DATE pomocí masky pevného známého formátu – nespoléhejte na NLS. Pokud máte pevnou hodnotu, můžete udělat totéž, nebo můžete použít datový literál , který je kratší a jednoznačný.

S formátem, který jste použili, zahrnete také všechny řádky, které mají sloupec nastaven na půlnoc 1. ledna 2000, ale ne později v tento den. To může být to, co chcete, ale ujistěte se, že rozumíte BETWEEN funguje. Pokud skutečně hledáte data v tomto desetiletí, včetně kdykoli 31. prosince 1999, můžete použít:

WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'

Pro časová razítka můžete buď použít TO_TIMESTAMP() nebo literál časového razítka:

WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'

Pro časová razítka s časovými pásmy můžete buď použít TO_TIMESTAMP_TZ() nebo literál časového razítka s názvy region časového pásma:

WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'


  1. Jak se u PDO mohu ujistit, že příkaz UPDATE byl úspěšný?

  2. Taktika normalizace serveru SQL Server:varchar vs int Identity

  3. Import CSV s čárkami v hodnotách řetězce

  4. je `date` platný název sloupce mysql?