
- •Лекция 4. Язык sql. Однострочные функции.
- •Функции
- •Примеры использования числовых функций
- •Символьные функции
- •Примеры использования функций для работы с датами
- •Модели формата даты и времени
- •Модели формата числа
- •Суффиксы, префиксы и другие элементы, влияющие на формат вывода
- •Примеры использования функций преобразования и моделей форматов
- •Пример использования to_char для преобразования чисел:
- •Вложенные однострочные функции
Суффиксы, префиксы и другие элементы, влияющие на формат вывода
Задавая модель формата можно использовать знаки пунктуации (/ . ,), а также символьные константы (заключенные в двойные кавычки), которые будут включены в результат. Кроме того, можно использовать:
Префикс FM |
Подавляет конечные пробелы в названиях месяцев и дней недели, оставляя результат переменной длины. Подавляются и ведущие нули в числах. Повтор FM отменяет подавление. |
Суффикс TH |
Для вывода порядковых числительных (например, DDTH для вывода в формате “4th”). |
Суффикс SP |
Для вывода чисел словами (например, DDSP для вывода слова “FOUR”) |
Сочетание суффиксов SP и TH: SPTH или THSP |
Для вывода порядковых числительных словами (например, DDSPTH или DDTHSP для вывода слова “FOURTH”). |
Примеры использования функций преобразования и моделей форматов
Примеры использования TO_CHAR для преобразования дат: Чаще всего функция TO_CHAR используется для преобразования даты при выводе. Дело в том, что Oracle выводит даты при выборке в формате, установленном по умолчанию. Это может быть, например, формат ‘dd-mm-yy’, ‘dd-mon-yy’ или ‘dd.mm.yy’. Как правило, формат, используемый по умолчанию, не содержит информации о времени, квартале месяца, столетии и пр. На практике часто возникает необходимость вывести более полную информацию, задав необходимый формат.
SELECT TO_CHAR(SYSDATE,'dd - mm - yyyy - hh24 - mi - ss') data
FROM dual;
Результат:
DATA
-----------------------------
06 - 10 - 2003 - 17 - 05 - 49
SELECT TO_CHAR(SYSDATE,'dd "of" Month "year" yyyy') data
FROM dual;
Результат:
DATA
-------------------------
06 of October year 2003
-- В данном примере число состоит из одной цифры, поэтому перед ним -- выводится ведущий 0, так как в модели формата указано, что число надо -- выводить двумя цифрами. Кроме того, модель ‘Month’ предполагает, что -- название месяца дополняется конечными пробелами до 9 символов. Чтобы -- убрать ведущие нули и конечные пробелы, используйте префикс FM.
SELECT TO_CHAR(SYSDATE,'fmdd "of" Month "year" yyyy') data
FROM dual;
Результат:
DATA
-------------------------
6 of October year 2003
SELECT TO_CHAR(SYSDATE,'fmDAY : MONTH : YEAR') data
FROM dual;
Результат:
DATA
---------------------------------------
MONDAY : OCTOBER : TWO THOUSAND THREE
Пример использования to_char для преобразования чисел:
SELECT salary, TO_CHAR(salary, '099999'), TO_CHAR(salary, '999'),
TO_CHAR(salary, '$99999'), TO_CHAR(salary, '99999V999')
FROM s_emp;
Результат:
SALARY TO_CHAR TO_C TO_CHAR TO_CHAR(S
--------- ------- ---- ------- ---------
2500 002500 #### $2500 2500000
1450 001450 #### $1450 1450000
1400 001400 #### $1400 1400000
1450 001450 #### $1450 1450000
…
25 rows selected
-- Символы # выводятся в случае, если количество цифр в числе превышает -- количество цифр, предусмотренное моделью формата.
Пример использования TO_CHAR в предложении WHERE: Вывести фамилии служащих, которые были приняты на работу в понедельник.
SELECT last_name
FROM s_emp
WHERE TO_CHAR(start_date, 'dy')='mon';
Результат:
LAST_NAME
------------
Nagayama
Menchu
Magee
Sedeghi
Примеры использования TO_DATE: Если Вы хотите привести в запросе конкретную дату, необходимо заключить ее в апострофы. Но сервер Oracle расценит ее как дату только в случае, если заданная дата приводится в соответствующем контексте и если ее формат совпадает с одним из форматов, используемых сервером по умолчанию. В противном случае, заданная дата может быть расценена как символьное значение, что может привести к ошибкам. Чтобы их избежать, рекомендуется всегда при задании дат в запросах пользоваться функцией TO_DATE, чтобы явно указать серверу, что вводимое Вами значение является датой.
SELECT last_name
FROM s_emp
WHERE start_date='05/09/1991';
Результат:
no rows selected
-- Данным запросом пользователь хотел найти служащих, принятых на работу 9 -- мая 1991 года. Сервер воспринимает введенное значение, как 5 сентября -- 1991года, поэтому не вернул ни одной строки. Тот же пример, но с -- указанием модели формата:
SELECT last_name
FROM s_emp
WHERE start_date=to_date('05/09/1991','mm/dd/yyyy');
Результат:
LAST_NAME
-------------------
Schwartz
SELECT ROUND('27-09-2003', 'year')
FROM dual;
Результат:
ERROR at line 1:
ORA-01722: invalid number
-- Функция ROUND может применяться как для округления чисел, так и для -- округления дат. По умолчанию Oracle пытается произвести округление числа, -- но так как округляемое значение заключено в апострофы, его нельзя -- расценить как число, что вызывает ошибку Oracle. Чтобы явно указать, что -- необходимо произвести округление даты, необходимо воспользоваться -- функцией TO_DATE:
SELECT ROUND(TO_DATE('27-09-2003','dd-mm-yyyy'), 'year')
FROM dual;
Результат:
ROUND(TO
--------
01.01.04