Sql Scholl
Распечатать страницу
Перейти на главную Карта сайта Отправить сообщение

Функции манипулирования данными

Функции манипулирования датой и временем

      Дата и время хранятся в таблицах с использованием соответствующих типов данных, каждая СУБД использует свои собственные типы. Значения даты и времени хранятся в специальном формате, поэтому их можно быстро и эффективно сохранить или отфильтровать, а также сохранить физическое пространство на диске.

      Формат, в котором хранятся дата и время, обычно нельзя использовать в приложениях, поэтому почти всегда используются функции даты и времени для чтения, расширения и манипулирования этими значениями. Функции манипулирования датой и временем являются одними из наиболее важных функций в SQL. К сожалению, они меньше всего поддаются переносу на другие платформы и реализации SQL.

      Чтобы продемонстрировать процедуру использования функции манипулирования датой и временем, приведем простой пример. В таблице Orders все заказы хранятся с датой заказа. Чтобы извлечь список всех заказов, сделанных в 2004 году, в SQL Server и Sybase необходимо выполнить следующее:

SELECT order_num
FROM Orders
WHERE DATEPART(yy, order_date) = 2004; 



order_num 
-------------------
20005 
20006 
20007 
20008 
20009 

     В Access используйте следующую версию примера:

SELECT order_num
FROM Orders
WHERE DATEPART('yyyy', order_date) = 2004;

      В этом примере (в версиях для SQL Server и Sybase и в Access) используется функция DATEPART (), которая, как видно из названия, возвращает только часть даты. В функции DATEPART () используются два параметра: часть, подлежащая возвращению, и дата, из которой эта часть возвращается. В рассматриваемом примере функция DATEPART () из столбца order_coluran возвращает только год. Путем сравнения полученного значения со значением 2004 предложение WHERE выбирает только те заказы, которые были сделаны в этом году.
     Ниже приведена версия данного примера для PostgreSQL, в которой используется похожая функция DATE_PART (): 

SELECT order_num
FROM Orders
WHERE DATE_PART('year', order_date) = 2004;

     В MySQL, помимо DATEPART(), есть множество других функций, предназначенных для манипулирования значениями дат. Пользователи MySQL могут использовать функцию YEAR () для выборки из даты значения года:

SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2004;

     В Oracle также нет функции DATEPART (), но существуют несколько других функций манипулирования датой, которые можно использовать с этой же целью. Рассмотрим пример:

SELECT order_num
FROM Orders
WHERE to_number (to__char (order_date, 'YY')) = 2004;

     В этом примере функция to_char() используется для извлечения части даты, а функция to_number () — для преобразования этой части в числовое значение, чтобы его можно было сравнить со значением 2004. 

     Тех же результатов можно добиться при помощи оператора BETWEEN

SELECT order_num
FROM Orders
WHERE order_date BETWEEN to_date('Ol-JAN-2004'
AND to date('31-DEC-2004');

      В этом примере функция Oracle to_date () используется для преобразования двух строк в даты. В одной содержится дата 1 января 2004, а в другой — 31 декабря 2004. Стандартный оператор BETWEEN используется для поиска всех заказов, сделанных в период между этими двумя датами. Этот код не будет работать в SQL Server, так как в этой СУБД не поддерживается функция to_date (). Однако если заменить функцию to_date() функцией DATAPART(), этот оператор можно будет использовать.

Даты в Oracle

Даты в формате ДД-МММ-ГГГГ (как в предыдущих примерах) системой Oracle обычно обрабатываются, даже если они не приведены к тому виду, как при использовании функции to_date (). Однако для надеж-ности лучше всегда использовать эту функцию.

     В приведенных примерах выбиралась и использовалась только часть даты (год). Чтобы выбрать заказы по месяцу, необходимо сделать то же самое, указав ключевое слово AND для сравнения месяца и года. 

     СУБД обычно могут выполнять гораздо больше действий, чем просто выборка части даты. В большинстве из них присутствуют функции для сравнения дат, выполнения простых арифметических операций с датами, опции форматирования дат и многое другое. Но, как вы уже заметили, функции манипулирования датой и временем различны для разных СУБД. Обратитесь к документации по своей СУБД и уточните, какие функции манипулирования датой и временем в ней поддерживаются.