Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сведения о языке SQL.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
159.14 Кб
Скачать

Работа с датами

В рассматриваемых СУБД для обработки времени мало общего. Самый минимум у 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) ;

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