Розрахунок різниці між датами, Інші СУБД, Бази даних, статті

Натрапив сьогодні на замітку на Oracle Tips & Tricks зі схожою назвою. У замітці розглядається забавний нюанс роботи з типом Date в СУБД Oracle. Розглянемо цей нюанс, так би мовити, російською.

Банальність.
Як багато хто пам’ятає, більшість середовищ зберігає дату як різницю між цією самою датою і якоїсь опорною датою, у вигляді числа. Таким чином 01.04.2008-3.111 буде представлятися користувачеві, звичайно, як 28.03.2008 21:20:10, однак зберігатися дата буде з більшою точністю. Тобто при виконанні дії 01.04.2008-3.111-01.04.2008 ми отримаємо -3.111.

Особливості.
При роботі в СУБД Oracle необхідно відзначити такі нюанси:


  1. Числові типи даних зберігаються в десятковому форматі.
  2. Точності більшою ніж до секунд домогтися при використанні типу DATE в СУБД Oracle неможливо.

Повернемося до прикладу, описаного вище.

Приклад.

SQL> select to_date(“01.04.2008”)-3.111 from dual;
TO_DATE(“01.04.2008”)-3.111
—————————
28.03.2008 21:20:10
SQL> select to_date(“01.04.2008”)-3.111-to_date(“01.04.2008”) from dual;
TO_DATE(“01.04.2008”)-3.111-TO
——————————
-3,11099537037037

Проблема? Ні, особливість!
Розглянемо 3.111 у вигляді дельти між датами. Що ми отримаємо?
3.111 * 24 * 60 * 60 = 3 дні 2:00 39 хвилин 50.4 секунди
При перетворенні до дати ми втрачаємо ті самі 0.4 секунди і отримуємо дельту3 дня 2:00 39 хвилин 50 секунди. Відповідно при зворотному перерахуванні ми отримаємо ((50/60 +39) / 60 +2) / 24 +3 = 3.11099537037037. Так що ось так.

Будьте обережні з неявним перетворенням даних!

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*