
- •Введение
- •Прочие команды
- •Структура базы данных
- •Ключи, ограничения
- •Индексы
- •Представления
- •Процедуры и функции
- •Триггеры
- •Пользователи и сессии
- •Инструментарий скачать субд
- •Инсталляция
- •Выполнение запросов
- •Использование примеров
- •Комментарий
- •Идентификаторы
- •Обзор типов данных
- •Интервал времени
- •Литералы
- •Выражения и операции
- •Строковые операции
- •Алгебраические операции
- •Операции отношения
- •Логические операции и предикаты
- •Условные выражения
- •Прочие операции
- •Обзор функций
- •Математические функции
- •Строковые функции
- •Работа с датами
- •Преобразование типов
- •Функции Oracle
- •Функции PostgreSql
- •Функции MySql
- •Создание таблицы
- •Значения полей по умолчанию
- •Ключи и ограничения
- •Настройка внешнего ключа
- •Создание по выборке
- •Дополнительные параметры таблицы
- •Изменение, удаление таблицы
- •Переименование таблицы или ее столбца
- •Добавление/удаление столбца
- •Первичный ключ
- •Уникальный ключ
- •Внешний ключ
- •Безошибочное удаление таблиц
- •Добавление записей
- •Значения по умолчанию
- •Подзапросы
- •Вставка по условию
- •Обновление записей
- •Обновление подзапросом
- •Обновление по данным другой таблицы
- •Удаление записей
- •Выборка записей
- •Выборка констант
- •Выборка по столбцам таблиц
- •Синонимы (алиасы)
- •Уникальные записи
- •Выборка по условию
- •Выборка по группам
- •Соединения
- •Агрегатные функции, группировка данных
- •Операции над выборками
- •Добавление итогов
- •Нумерация записей
- •Обеспечение уникальности первичного ключа
- •Столбцы с автоинкрементом
- •Индексы
- •Представления
- •Динамический sql (dsql)
- •Процедурные операторы блоковая структура кода
- •Присвоение
- •Условный оператор
- •Оператор выбора
- •Безусловный цикл
- •Цикл с предусловием
- •Цикл по счетчику
- •Цикл по элементам
- •Операторы выхода/продолжения итерации
- •Выборка в переменные
- •Хранимые процедуры
- •Вызов процедур
- •Исключения
- •Курсоры
- •Триггеры
- •Числа прописью
- •Транзакции, конкурирующие запросы
- •Управление аккаунтами пользователи
- •Права доступа
- •Права доступа MySql
- •Права доступа PostgreSql
- •Права доступа Oracle
- •Удаление прав доступа
- •Роли PostgreSql
- •Роли Oracle
- •Роли MySql
- •Файловый вывод/ввод
- •Информация о базе данных
Работа с датами
В рассматриваемых СУБД для обработки времени мало общего. Самый минимум у Oraсle:
current_date - глобальная переменная содержащая текущую дату. Можно использовать и в других СУБД;
trunc(d,s) - приводит дату к началу указанной временной отметки, например к началу месяца. В PostgreSQL есть аналогичная функция date_trunc(s,d). В MySQL для этих целей может использоваться функция date_format(d,s), но она возвращает результат в виде строки;
add_months(d,n) - добавляет к дате указанное число месяцев;
last_day(d) - последний день месяца, содержащегося в аргументе;
months_between(d1,d2) - возвращает число месяцев между датами.
Ниже приведены допустимые форматы в строковом параметре s для функций trunc и date_trunc соответственно:
квартал - q, quarter;
год - yyyy, year;
месяц - mm, month;
неделя - ww, week;
день - dd, day;
час - hh, hour;
минута - mi, minute.
Такие функции как last_day в других СУБД реализуются с помощью арифметики времени и преобразования типов. Так что при желании можно написать соответствующую функцию. Ниже приведена выборка последнего дня указанной даты.
-- для PostgreSQL
select cast( (date_trunc('month', date '2009-01-15')
+ interval '1 month') as date) - 1 as d
-- для MySQL
select date ( date_format('2009-01-15','%Y-%m-01'))
+ interval 1 month
- interval 1 day as d
Преобразование типов
Множество типов разрешенные для преобразования в конструкции CAST AS определяется реализацией СУБД. Так в MySQL может преобразовать только следующие типы: binary[(n)], char[(n)], date, datetime, decimal[(m[,d])], signed [integer], time, unsigned [integer]. А в Oracle, кроме преобразования встроенных типов, можно преобразовывать выборки со множеством записей в массивы.
-- MySQL
select CAST('5.3' AS decimal)+2
select CAST( (select '5.3') AS decimal(6,2))+2.0
-- Oracle
select CAST('5,22' AS double precision) +2 from dual
-- PostgreSQL
select CAST('5.22' AS double precision) +2
В PostgreSQL более расширенные возможности по преобразованию. Во-первых, можно добавить собственное преобразование для встроенных и пользовательских типов. Во-вторых, есть собственный более удобный оператор преобразования типов ::.
select cast('tru' as boolean);
select cast('fa' as boolean);
-- ошибка, строка не похожа на 'true', 'false'
-- и не равна строкам '1' или '0'
select cast('ok' as boolean)
-- создадим функцию преобразования
-- просто указываем какие строки
-- понимать как true значение,
-- все остальные строки будут false значением
CREATE OR REPLACE FUNCTION to_bool(varchar)
RETURNS boolean
AS $$
SELECT $1 = 'true' or $1 = 'tru' or
$1 = 'tr' or $1 = 't'
or $1 = '1' or $1='ok'$$
LANGUAGE SQL;
-- создаем преобразование типа varchar в boolean
CREATE CAST (varchar AS boolean)
WITH FUNCTION to_bool(varchar)
AS ASSIGNMENT;
-- теперь можно так
select cast ( 'ok'::varchar as boolean);
select cast( varchar 'ok' as boolean);
select 'ok'::varchar::boolean;
-- уничтожение преобразования
DROP CAST IF EXISTS (varchar AS boolean) ;
В большинстве случае необходимо преобразование в строку либо из строки. Для этого случая СУБД предоставляют дополнительные функции.