Самоучитель по SQL-сервер в Linux



Функции преобразования типа

Хотя PostgreSQL позволяет выполнять явные преобразования между основными типами данных, некоторые преобразования удобнее выполнять при помощи функций. В табл. 5.13 перечислены основные функции преобразования типов PostgreSQL, а ниже приводятся их подробные описания.

Таблица 5.13. Функции преобразования типов

Функция

Описание

t>1tfromint4(n)

Преобразует число в битовую последовательность

DlttOinW(b)

Преобразует битовую последовательность в десятичное представление

to_cnar(n. f)

Преобразует число в строку в формате f

to_char(t. f)

Преобразует значение типа timestamp в строку в формате f

to_date(s. f)

Преобразует строку в формате даты f в значение типа date

to_number(s. f)

Преобразует строку в формате даты f в значение типа numeric

to timestamp(s. f)

Преобразует строку в формате даты f в значение типа timestamp

timestamp(d)

Преобразует значение типа date к типу timestamp

timestamp(d. t)

Преобразует два значения типов date и time к типу timestamp

bitfromint4()

Синтаксис:

bit.fromint4(n)

Функция bitfromint4() получает один аргумент п типа integer и возвращает его представление в виде битовой последовательности. Поскольку явного преобразования между двоичным и целочисленным типом не существует, преобразование десятичных данных в двоичную систему счисления должно Осуществляться специальной функцией.

Возвращаемое значение относится к типу bi t, а его длина не превышает 32 бита. Поскольку тип i nteger является знаковым, допустимые значения аргумента лежат в интервале от -2 147 483 648 до 2 147 483 647.

Пример

booKtown=# SELECT bitfronrint4(16385);

bitfromint4

00000000000000000100000000000001

(1 row)

bittoint4()

Синтаксис:

bittoint4(b)

Функция bittoint4() фактически является обратной по отношению к bitfromint4() — она получает один аргумент b тина bit п возвращает его десятичное числовое значение в виде тина integer.

Соответственно аргумент функции bitfrwint4() содержит до 32 двоичных цифр, а возвращаемое значение лежит в интервале от -2 147 483 648 до 2 147 483 647.

Пример

booktown=# SELECT bittoint4(B'101010').

booktown-# Mttoint4(bitfromint4(99))

AS inverse_example: bittoint4 inverse_example

42 | 99

(1 row)

to_char() для чисел

Синтаксис:

to_char(n. f)

Функция to_char(), вызываемая с аргументом п типа numeri с и аргументом f типа text, форматирует число п в строку типа text. Строка f описывает формат выходного значения.

Форматная строка f состоит из метасимволов, вместо которых PostgreSQL подставляет представляемые ими значения. Метасимволы, используемые в форматных строках, перечислены в табл. 5.14.

Таблица 5.14. Метасимволы форматирования чисел

Символ

Описание

9

Цифра

0

Цифра или начальный/конечный ноль, если количество цифр в f превышает количество цифр в п; может использоваться для принудительного вывода цифр в левой или правой части результата

.

Точка, отделяющая целую часть числа от дробной. Число может содержать только одну точку

'

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

D

Десятичный разделитель (например, точка), определяемый в локальном контексте

G

Разделитель групп разрядов (например, запятая), определяемый в локальном контексте

PR

Если PR находится в конце строки f, для отрицательных значений п результат заключается в угловые скобки

SG

Знак плюс (+) или минус (-) в зависимости от значения п

MI

Знак минус (-), если число п является отрицательным

PL

Знак плюс (+), если число п является положительным

S

Знак плюс (+) или минус (-), определяемый в локальном контексте

L

Денежный знак, определяемый в локальном контексте

RN

Римские цифры для значений п в интервале от 1 до 3999

TH. th

Суффикс числительного для числа п (например, 4th или 2nd)

V

Для каждого метасимвола 9 после V добавляется лишний ноль, то есть фактически происходит умножение на степень 10

FM

Из числа удаляются все начальные и завершающие нули (созданные символами 9, но не 0), а также все лишние пробелы

Если количество цифровых позиций, обозначенных метасимволом 9 в форматной строке, превышает количество цифр в числе п, лишние позиции заполняются пробелами. Если лишние цифровые позиции обозначены метасимволом 0, лишние позиции заполняются нулями.

Если количество заданных цифровых позиций меньше необходимого для представления целой части числа, преобразование становится неоднозначным из-за потери значащих цифр. Поскольку функция to_char() не знает, какие именно цифры следует удалить, во всех заданных позициях выводится символ #. Следовательно, в форматную строку необходимо включить максимальное количество цифр, кото-

рые могут быть получены в результате форматирования. Для удаления лишних пробелов также можно воспользоваться функцией trans! ate() или функциями усечения (HrimO и т. д.).

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

ПРИМЕЧАНИЕ

В форматной строке можно свободно использовать любые символы, не являющиеся метасимволами (например, символ $ и др.) В отформатированной строке они выводятся без изменений.

Примеры

booktown=# SELECT to_char(123456789. '999G999G999D99') AS formatted,

booktown-# to_char(123456789. '999999999') AS justjrigits,

booktown-f to_char(123456789, '00999999999') AS with_zeroes;

formatted | justjrigits | with_zeroes

123.456.789.00 | 123456789 | 00123456789

(1 row)

booktown=# SELECT cost * 100 AS cost_to_order.

booktown-# to_char(cost * 100, '$99.999.99') AS monetary,

booktown-# translate(to_char(cost * 100. '$9,999.99'),' ',").

booktown-# AS translated

booktown-# FROM stock

booktown-* LIMIT 3;

cost_to_order monetary translated

2900.00 | $ 2.900.00 $2.900.00

3000.00 $ 3.000.00 $3.000.00

1600.00 $ 1,600.00 i $1.600.00

(3 rows)

booktown=# SELECT tojrhard.O. '9th "Place"') AS first.

booktown-# to_char(2.2, '9th "Place"') AS second,

booktown-# to_char(pi( ), '9th "Place"') AS third,

booktown-# to_char(10, '99V99th "\\"Place\\.....) AS shifted jjp;

first | second | third | shifted_up

1st Place | 2nd Place | 3rd Place | 1000th "Place"

(1 row)

ПРИМЕЧАНИЕ

В PostgreSQL версии 7.1.x ошибка в реализации метасимволов RN (римская запись) приводит к тому, что функция to_char() возвращает неправильный результат, если в форматной строке отсутствует последовательность FM. Ошибка должна быть исправлена в версии 7.2, а в качестве временной меры можно использовать полную последовательность FMRN.

to_char() для типа timestamp

Синтаксис:

to_char(t. f)

При вызове с аргументом t типа timestamp и аргументом f типа text функция to_char() форматирует дату и время в строку, возвращаемую в виде значения типа text.

Как и в случае с предыдущей версией to_char(), строка f содержит метасимволы, вместо которых PostgreSQL подставляет литералы. Метасимволы, используемые в форматных строках даты и времени, перечислены в табл. 5.15.

Таблица 5.15. Метасимволы форматирования чисел

Символ

Описание

НН. НН12

Час (от 1 до 12)

НН24

Час (от 0 до 23)

Ml

Минуты (от 0 до 59)

SS

Секунды (от 0 до 59)

SSSS

Секунды, прошедшие с полуночи (от 0 до 86 399)

AM, РМ, А.М, Р.М

Обозначение части суток в верхнем регистре с необязательным разделением символов точками

am, pm, a . m, p . m

Обозначение части суток в нижнем регистре с необязательным разделением символов точками

TZ, tz

Часовой пояс в верхнем или нижнем регистре

CC

Век, представленный двумя цифрами (не равен тку, деленному на 100!)

Y, YY, YYY, YYYY, Y.YYY

Последняя цифра, две цифры, три или четыре цифры года (с необязательным включением запятой)

BC, AD, B.C, A.O

Признак эры в верхнем регистре

be, ad, b.c, a.d

Признак эры в нижнем регистре

MONTH, Month, month

Полное название месяца, дополненное справа пробелами до 9 символов и записанное либо в верхнем регистре, либо с начальной прописной буквой, либо в нижнем регистре

MON, Mon, mon

Сокращенное трехбуквенное обозначение месяца, записанное либо в верхнем регистре, либо с начальной прописной буквой, либо в нижнем регистре

MM

Номер месяца (от 1 до 12)

RN, rn

Номер месяца в римской записи (от I до XII), в верхнем или нижнем регистре

DAY, Day, day

Полное название дня недели, дополненное справа пробелами до 9 символов и записанное либо в верхнем регистре, либо с начальной прописной буквой, либо в нижнем регистре

DY, Dy, dy

Сокращенное двухбуквенное обозначение дня недели, записанное либо в верхнем регистре, либо с начальной прописной буквой, либо в нижнем регистре

DDD, DD, D

День года (от 1 до 366), день месяца (от 1 до 31) или день недели (от 1 до 7, начиная с воскресенья)

W

Неделя месяца (от 1 до 5, с первого дня месяца)

WW

Неделя года (от 1 до 53, с первого дня года)

IW

Неделя года в стандарте ISO (с первого четверга нового года)

TH, th

Суффикс для предшествующего числа в верхнем или нижнем регистре

fm

Из строки удаляются все лишние нули и пробелы

Суффикс ТН и префикс FM должны непосредственно примыкать к тому значению, которое они модифицируют. Например, чтобы префикс FM применялся к компоненту Day, строка должна иметь вид FMDay (а не FM Day). Аналогично, чтобы день месяца выводился с суффиксом числительного, потребуется форматная строка DDTH (а не DD ТН).

Примеры

booktown=# SELECT to_char(now(). 'HH:MI PM1) AS the_time;

the_time

05:04 PM

(1 row)

booktown=# SELECT to_char(now(), 'Dy (Day), Mon (Month)')

booktown-# AS abbreviations,

booktown-# to_char('yesterday'::timestamp, 'FMMonth FMDDth')

booktown-# AS yesterday.

booktown-# to_char('yesterday':itimestamp, 'FMDDth FMMonth')

booktown-# AS "yesterday UK";

abbreviations | yesterday j yesterday UK

Sat (Saturday ). Sep (September) | August 31st | 31st August

(1 row)

booktown=# SELECT isbn,

booktown-# to_char(publication, 'FMMonth FMDDth, YYYY')

booktown-# AS informal,

booktown-# to_char(publication, 'YYYY-MM-DD') AS formal,

booktown-# to_char(publication. 'Y.YYY "years" A.D.')

booktown-# AS firstj)ublished

booktown-# FROM editions LIMIT 3;

isbn | informal | formal first_pub1ished

039480001X | March 1st. 1957 1957-03-01 1.957 years A.O.

0451160916 | August 1st. 1981 | 1981-08-01 | 1.981 years A.D.

0394800753 | March 1st. 1949 | 1949-03-01 | 1.949 years A.D.

(3 rows)

to date()

Синтаксис:

to_date(s. f)

Функция to_date() получает два аргумента типа text. Аргумент f описывает формат даты, представленной строкой s, и содержит метасимволы из табл. 5.15. Результат возвращается в виде значения типа date.

В PostgreSQL поддерживается много распространенных форматов данных, однако предусмотреть все форматы невозможно. Функция to_date() гарантирует, что практически любой формат даты, описываемый метасимволами из табл. 5.14, может быть преобразован в значение типа date.

Пример

booktown=# SELECT date('198025thJune')

booktown-f AS non_standard_date_format,

booktown -# toJate (' 198025thJune', ' YYYYDDthMonth')

booktown-# AS correct_interpretation;

non_standard_date_format correct_interpretation

2025-08-27 | 1980-06-25

(1 row)

to_number()

Синтаксис:

to_number(s. f)

Функция to_number() получает два аргумента типа text. Аргумент f описывает формат числа, представленного строкой s, и содержит метасимволы из табл. 5.14. Результат возвращается в виде значения типа numeric.

Примеры

booktown=# SELECT to_number('$2,900.00', 'L9G999D99')

booktown-# AS monetary: monetary

2900.00 (1 row)

booktown=# SELECT tojiumber('123.456.789.00' . '999G999G999D99')

booktown-# AS formatted,

booktown-# to_numberС123456789'. '999999999')

booktown-# AS just_digits,

booktown-# to_number('00123456789'. '00999999999')

booktown-# AS leading_zeroes;

formatted | just_d1gits | leading_zeroes

123456789.00 123456789 | 123456789

(1 row)

to_timestamp()

Синтаксис:

to_timestamp(s. f)

Функция to_timestamp() получает два аргумента типа text. Аргумент f описывает формат даты/времени, представленного строкой s, и содержит метасимволы из табл. 5.15. Результат возвращается в виде значения типа date.

Эта функция, как и to_date(), прежде всего обеспечивает возможность правильной интерпретации нестандартных строк, содержащих дату и время.

Пример

booktown=# SELECT timestamp('197825thJuly01:12am')

booktown-# AS non_standard_timestamp,

booktown-l to_fimestamp('197825July01:12am',

booktown(# 'YYYYDDFMMonthHH12:MIam')

booktown-# AS correcMnterpretation;

non_standard_timestamp | correctjnterpretation

2025-06-27 01:12:00-07 1978-07-25 01:12:00-07

(1 row)

ПРИМЕЧАНИЕ

Модификатор FM имеет важное значение для правильной интерпретации данных, следующих за названием месяца или дня недели, поскольку эти названия часто дополняются пробелами до 9 символов. Помните, что модификатор FM не является глобальным — он должен предшествовать каждом/элементу, к которому он применяется.

timestamp()

Синтаксис:

timestamp(d) timestamptd, t)

Функция ti mestampC) получает либо один аргумент типа date, либо два аргумента типов date и time соответственно. Переданные аргументы преобразуются в значение типа tlmestamp и возвращаются функцией. При передаче одного аргумента предполагается, что время соответствует полуночи заданной даты.

Пример

booktown=# SELECT timestamp(date('now'))

AS today_at_midnight,

booktown-# timestamp(dateCnow'),

booktownd time('now')) AS right_now;

today_at_m1dnight | rightjiow

2001-09-01 00:00:00-07 | 2001-09-01 18:04:16-07

(1 row)