Oracle робота з датами в oracle

При відображенні інформації про час або дати в Oracle критично, яку версію сервера ви використовуєте. Наприклад, починаючи з версії 9, стало можливим уявлення моментів часу і тимчасових інтервалів використовуючи типи даних ANSI SQL. Наприклад, timestamp and interval. Ранні версії використовували тип даних date. з точністю одна секунда і часовими інтервалами як числа (де 1 = один день).

Якщо ви використовуєте нові версії сервера Oracle. то настійно рекомендується використовувати нові типи даних в ваших додатках, якщо звичайно не планується використовувати додаток на серверах які не підтримують такі типи.

Для ілюстрації використаємо простий приклад реєстрації користувачів в системі, наприклад на будь-якому форумі. Для цього створимо таблицю і наповнимо її даними:


Тепер виберемо користувачів, які зареєструвалися протягом останнього дня:

або, в залежності від національних налаштувань

Для явного завдання формату виведення дати, перепишемо пропозицію так:

Крім того, за своїм бажанням, ви можете змінювати інтервал, збільшуючи або зменшуючи його, залежно від завдання. наприклад:

Ви можете явно вказувати формат для дати і часу:

В результаті бачимо, м'яко кажучи, неоковирне форматування. Виправляємо ситуацію, переписавши SQL пропозицію так:

Деякі речі слід знати, і для простоти покажу на прикладах:

Обчислення тимчасових інтервалів може бути досить неприємною завданням, оскільки в стандартному SQL немає можливості звернеться до значення цієї колонки з попередній рядка в звіті. Це легко зробити в будь-якій мові програмування, наприклад C #, Visual Basic, Java або Delphi, які можуть прочитати базу даних, і потім зробити це своїми засобами не вдаючись до SQL.

Додамо ще кілька рядків до нашої таблиці зі списком користувачів:

Наприклад, нам цікава середня тривалість часу між реєстрацією користувачів:

Перепишемо запит з об'єднанням:

Для забезпечення унікальності використовуємо колонку USER_ID. оскільки час і дата реєстрації не забезпечують унікальність, тому що можлива ситуація одночасної реєстрації двох користувачів.

Зараз у нас є поруч розташовані колонки з даними, що представляють собою якийсь звіт, і можна підрахувати інтервали:

Інтервал для кожної колонки повертає день, години, хвилини і секунди. За цим тимчасовим точкам можна розрахувати середній інтервал. Для цього напишемо такий запит:

Oracle видав помилку. У чому ж справа? На жаль Oracle не опинився досить розумним, щоб розрахувати середнє значення тимчасового інтервалу. І як би не було сумно, розрахувати середнє значення виявилося не так просто як хотілося б.

Якщо у вас є бажання, то ви можете переписати пропозицію SQL в такому вигляді:

Якщо ви хочете використовувати такі дикі запити, то будь ласка, але в даному випадку доцільніше створити уявлення:

І тепер, можна порахувати середнє значення у хвилинах:

Посилання по темі

Схожі статті