![]() |
![]() |
![]() |
Функции преобразования типа Хотя PostgreSQL позволяет выполнять явные преобразования между основными типами данных, некоторые преобразования удобнее выполнять при помощи функций. В табл. 5.13 перечислены основные функции преобразования типов PostgreSQL, а ниже приводятся их подробные описания. Таблица 5.13. Функции преобразования типов
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, лишние позиции заполняются нулями. Если количество заданных цифровых позиций меньше необходимого для представления целой части числа, преобразование становится неоднозначным из-за потери значащих цифр. Поскольку функция 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. Метасимволы форматирования чисел
Суффикс ТН и префикс 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) |
![]() |
![]() |
![]() |