No Image

Firebird преобразование даты в строку

СОДЕРЖАНИЕ
1 524 просмотров
10 марта 2020

Рассмотрены вопросы, необходимые разработчику для создания клиент-серверных приложений с использованием СУБД Firebird, явившейся развитием СУБД Borland Interbase 6. Содержится обзор концепций и моделей архитектуры клиент/сервер, а также практические рекомендации по работе с клиентскими библиотеками Firebird. Детально описаны особенности типов данных SQL, язык манипулирования данными (Data Manipulation Language, DML), а также синтаксис и операторы языка определения данных ( Data Definition Language, DDL). Большое внимание уделено описанию транзакций и приведены советы по их использованию при разработке приложений. Описано программирование на стороне клиента и сервера написание триггеров и хранимых процедур, создание и использование событий базы данных, обработка ошибок в коде на сервере и многое другое. Материал сопровождается многочисленными примерами, советами и практическими рекомендациями.

Для разработчиков баз данных

Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Преобразование типов даты в CHAR(n) и VARCHAR(n)

Разделы на этой странице:

Преобразование типов даты в CHAR(n) и VARCHAR(n)

Используйте в операторах SQL-функцию CAST() для трансляции данных даты и времени в символьные типы данных.

Firebird преобразует типы дата и время в форматированные строки, в которых дата (если присутствует) представлена в установленном формате – в зависимости от диалекта – а время представлено в стандартном для Firebird формате: HH:MM:ss.nnnn. Необходимо использовать столбец, переменную типа CHAR или VARCHAR подходящего размера для получения желаемого вами результата.

Преобразование типов дата/время можно выполнять в оба строковых типа фиксированной длины CHAR и переменной длины VARCHAR. Поскольку размер преобразуемой строки заранее известен, CHAR имеет небольшое преимущество перед VARCHAR: использование CHAR при передаче по сети сэкономит вам два байта, которые добавляются к VARCHAR для хранения размера. "Правильный размер" зависит от диалекта, обратите на это внимание, VARCHAR может быть более подходящим при использовании в коде приложения, которое может обрабатывать оба диалекта.

Читайте также:  Vba select case пример

Если символьное поле слишком мало для результата, то появится исключение переполнения. Пусть, вам нужно получить строку, содержащую только дату из TIMESTAMP. Использование для этого символьного контейнера меньшего размера не будет работать – CAST() не обрезает выходную строку. Необходимо выполнить двойное преобразование: вначале преобразование TIMESTAMP в DATE, а затем преобразование даты в символьный тип корректного размера – см. примеры в следующем разделе.

Диалект 3

Преобразование DATE или TIMESTAMP создает дату в формате ISO (CCYY-MM-DD). Полная длина выходной строки 10 символов для DATE и 11 – для TIMESTAMP (дата и один пробел перед временем). Нужно 13 символов для TIME или для времени в TIMESTAMP.

SELECT CAST(timestamp_col as CHAR(24)) AS TstampTxt FROM RDB$DATABASE;

даст строку вроде следующей:

Это выдаст исключение переполнения:

SELECT CAST (timestamp_col as CHAR(20)) AS TstampTxt FROM RDB$DATABASE;

Classic List Threaded

Переменчивый формат даты

В таблице есть поле BIRTHDAY типа DATE.
Почему
SELECT BIRTDAY FROM . возвращает дату в виде ‘12.12.1965’,
а, например,
SELECT CAST(BIRTDAY AS VARCHAR(10)) FROM .
или
SELECT ‘День рождения: ‘ || (BIRTDAY AS VARCHAR(10)) FROM .
возвращает дату в виде ‘1965-12-12’?
И что надо сделать, чтобы формат всегда был ‘dd.mm.yyyy’?

Re: ðÅÒÅÍÅÎÞÉ×ÙÊ ÆÏÒÍÁÔ ÄÁÔÙ

> SELECT BIRTDAY FROM . возвращает дату в виде ‘12.12.1965’,

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

> а, например,
> SELECT CAST(BIRTDAY AS VARCHAR(10)) FROM .
> или
> SELECT ‘День рождения: ‘ || (BIRTDAY AS VARCHAR(10)) FROM .
> возвращает дату в виде ‘1965-12-12’?

потому что это преобразование даты в строку на сервере,
и он ее преобразует в СОРТИРУЕМЫЙ строковый вид.
нормально сортируется только дата в японском формате.

Читайте также:  Mysql notifier что это

> И что надо сделать, чтобы формат всегда был ‘dd.mm.yyyy’?

ничего. не преобразовывать даты в строки на сервере.


Dmitri Kouzmenko, www.ibase.ru, 953-13-34

Re: ðÅÒÅÍÅÎÞÉ×ÙÊ ÆÏÒÍÁÔ ÄÁÔÙ

Dmitri Kouzmenko wrote:

>> И что надо сделать, чтобы формат всегда был ‘dd.mm.yyyy’?
> ничего. не преобразовывать даты в строки на сервере.

или если уж так приспичило, преобразовывать на сервере в нужный
тебе формат.
1. через udf
2. cast(extract(day from dt) as varchar(2))||cast(extract(month.


Dmitri Kouzmenko, www.ibase.ru, 953-13-34

Re: Переменчивый формат даты

> 2. cast(extract(day from dt) as varchar(2))||cast(extract(month.

Тогда вместо ‘12.08.1965’ я получу ‘12.8.1965’, что не очень хорошо

Re: ðÅÒÅÍÅÎÞÉ×ÙÊ ÆÏÒÍÁÔ ÄÁÔÙ

Sergey K wrote:
> > 2. cast(extract(day from dt) as varchar(2))||cast(extract(month.
>
> Тогда вместо ‘12.08.1965’ я получу ‘12.8.1965’, что не очень хорошо


Dmitri Kouzmenko, www.ibase.ru, 953-13-34

Re: ðÅÒÅÍÅÎÞÉ×ÙÊ ÆÏÒÍÁÔ ÄÁÔÙ

Hello, Sergey!
You wrote on Sat, 30 Jul 2005 17:23:51 +0500:

>> 2. cast(extract(day from dt) as varchar(2))||cast(extract(month.

SK> Тогда вместо ‘12.08.1965’ я получу ‘12.8.1965’,
SK> что не очень хорошо

Небольшой трюк (здесь обсуждали, автора не помню, sorry):

select
substring(cast(1+100 as char(3)) from 2 for 2)
from rdb$database

вернет строку ’01’. Впрочем, cast можно выбросить:

select
substring(1+100 from 2 for 2)
from rdb$database

select
substring(extract(day from current_date)+100 from 2 for 2)||’.’||
substring(extract(month from current_date)+100 from 2 for 2)||’.’||
extract(year from current_date)
from rdb$database

возвращает текущую дату в требуемом тебе формате.

Удач

Alexander A. Venikov, Tobolsk, Russia
Real e-mail address is venixtn tob ru

Главные вкладки

Не смотря на то, что записи в блоге я делаю редко, мысль на месте не стоит. Поэтому Вот еще одно откровение:
CAST () – как это работает?
Можно написать в гугле запрос и увидеть, что это такое. От себя хочу добавить такой вот пример процедуры.
Задача: написать процедуру, которая бы выдавала цифро-буквенный код для номера документа.

Читайте также:  Epson scanner 010f драйвер для windows 10

В результате выполнения получим код документа в формате: ДXXXYYZZ
Где XXX – порядковый номер документа с нолями, YY – номер текущего месяца, ZZ – последние 2 цифры текущего года.
CAST требует обязательно указывать в строку какой длины преобразуется число.

Комментировать
1 524 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
Adblock
detector