G.F.N. company limited liability - Консалтинговая компания
Группа сайтов GetForNet ®
Обновить страницу
Кратко
Статьи
Ссылки
RSS-лента
Лицензии
Скачать
Здесь вы можете прочитать случайную статью из блогов, посвященных Oracle.

Расчет разницы между датами

Наткнулся сегодня на заметку на 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 часа 39 минут 50.4 секунды
При преобразовании к дате мы теряем те самые 0.4 секунды и получаем дельту3 дня 2 часа 39 минут 50 секунды. Соответственно при обратном пересчете мы получим ((50/60+39)/60+2)/24+3 = 3.11099537037037. Так что вот так.

Будьте аккуратны с неявным преобразованием данных!

Read more...
No news at present, please check back later.


Посещений, всего:15810, уникальных:3101
Сегодня:12, за месяц:174 - среднее:19.33 в день -
Владелец: G.F.N Ltd .|. Добавить сайт в Избранное
Проекты:Busines$men.ru | Face-mould | Orion
Google
 
Яндекс цитирования