Типовете данни и разликите между тях са в документацията . Кратката версия е:
- DATE има точност до секунда без поддръжка на часова зона;
- TIMESTAMP има точност до части от секундата (до девет знака след десетичната запетая, но вашата операционна система също влияе върху това), все още без поддръжка на часова зона;
- TIMESTAMP WITH TIME ZONE има същата точност като TIMESTAMP, но има и поддръжка за часови зони, както подсказва името;
- TIMESTAMP WITH LOCAL TIME ZONE настройва съхранената стойност към и от местната часова зона на сесията за създаване/заявка.
Може да намерите тази статия също интересно.
Всеки път, когато сравнявате стойности за дата и час, съхранени във вашата база данни, трябва да използвате стойности от същия тип данни, за да ги сравнявате. Не искате да преобразувате всяка стойност в колоната за сравнение, особено ако колоната е индексирана. Ако имате колона DATE, тогава сравнете с DATE - не сравнявайте като низ и не разчитайте на имплицитно преобразуване от низ. Когато го направите:
WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'
разчитате, че вашият NLS_DATE_FORMAT е DD-MON-YYYY, а вашият NLS_DATE_LANGUAGE е английски. Ако някой друг изпълни същата заявка в друга сесия, техните настройки може да доведат до неуспех на заявката (или в някои случаи да дадат грешни резултати, което може да бъде по-лошо). За да избегнете езиковия проблем, е по-добре да използвате номера на месеците, а не имена. Ако имате низова променлива за сравнение, трябва да използвате TO_DATE()
за да преобразувате низа в ДАТА, като използвате фиксирана маска за известен формат - не разчитайте на NLS. Ако имате фиксирана стойност, можете да направите същото или можете да използвате литерал за дата
, което е по-кратко и недвусмислено.
С формата, който сте използвали, вие също така включвате всички редове, които имат колона, настроена на полунощ на 1 януари 2000 г., но не и по-късно през този ден. Това може да е това, което искате, но се уверете, че разбирате как МЕЖДУ
върши работа. Ако всъщност търсите дати в рамките на това десетилетие, включително по всяко време на 31 декември 1999 г., можете да използвате:
WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'
За времеви клейма можете да използвате или TO_TIMESTAMP()код>
или литерал на времево клеймо:
WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'
За времеви клейма с часови зони можете да използвате или TO_TIMESTAMP_TZ ()
или литерал на времево клеймо с имена на регион на часовата зона:
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'