Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL- Разлика между TIMESTAMP, DATE И TIMESTAMP С ЧАСОВА ЗОНА?

Типовете данни и разликите между тях са в документацията . Кратката версия е:

  • 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'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01461:може да обвърже LONG стойност само за вмъкване в LONG колона - Възниква при запитване

  2. Обединяване на припокриващи се сегменти за измерване на ефективната дължина

  3. Неявна разлика в преобразуването на потока от данни CAST спрямо ssis

  4. Връщане на стойността на колоната за идентичност след вмъкване в Oracle

  5. Прогнозиране на растежа на таблицата на Oracle