Аналог date_format (MySql) для Firebird

Руслан

Новичок
При запросе к БД (Firebird) требуется отформатировать дату определенным образом. При работе с MySql это позволяет сделать date_format. Есть ли аналог этой функции для Firebird? Если у кого есть ссылочка в мануал Файрбёрда по этой функции - поделитесь. Или напишите, что за функция - поищу. Спасибо.
 

Руслан

Новичок
C EXTRACT'ом какие-то мрачные конструкции получаются.
Если на MySql весь мой кодпо выборке данных в том числе с отформатированной датой выглядит так:

PHP:
$LOGTS11q = mysql_query($conn, "SELECT *, DATE_FORMAT(TS11_DATE, '%d-%m-%Y') FROM TS11_DAY_ARCH where TS11_DATE >='".$valstartdate." 00:00' and TS11_DATE <='".$valenddate." 00:00' order by TS11_DATE");
То при использовании EXTRACT на ФБ, приходится помимо этого запроса на выборку всех данных ещё несколько раз ЭКСТРАКТИТЬ поочередно день, месяц, год. Причём форматы вывода значительно ограниченней нежели в date_format (MySql).
В словарике по FB нашёл вот такой вариант написания процедуры возвращения даты-времени в формате 0000-00-00 00:00.

PHP:
CREATE OR ALTER PROCEDURE BDATE_TIME(
    DT TIMESTAMP)
RETURNS (
    RESULT VARCHAR(16))
AS
begin
  --извлекаем день 
  SELECT l.result||'.' FROM lpad(extract(day FROM :dt),2,'0') l INTO result;
 
  --извлекаем месяц
  SELECT :result||l.result||'.' FROM lpad(extract(month FROM :dt),2,'0') l INTO result;
 
  --извлекаем год 
  SELECT :result||l.result||' ' FROM lpad(extract(year FROM :dt),4,'0') l INTO result;
 
  --извлекаем час 
  SELECT :result||l.result||':' FROM lpad(extract(hour FROM :dt),2,'0') l INTO result;
 
  --извлекаем минута 
  SELECT :result||l.result FROM lpad(extract(minute FROM :dt),2,'0') l INTO result;
 
  --result = '00.00.0000 00:00';
 
  suspend;
 
end
Громоздко.
 

Руслан

Новичок
Вобщем путём проб и ошибок, чтения мануалов и пр. пришёл к, как мне кажется довольно симпатичному решению. Обошёлся без процедуры.
Запрос в итоге выглядит так:
PHP:
SELECT CAST(lpad(EXTRACT(DAY FROM TS11_DATE),2,'0') AS varchar(2))||'-'|| CAST(lpad(EXTRACT(MONTH FROM TS11_DATE),2,'0') AS varchar(2))||'-'|| EXTRACT(YEAR FROM TS11_DATE) AS FDATE FROM TS11_DAY_ARCH
Что тут у нас происходит. Начну изнутри наружу. Extract - вытягиваем из TS11_DATE (дата) сначала день, потом месяц, потом год. Extract вытягивает месяца и дни в формате 1-12 и 1-31, а нам надо 01-12 и 01-31. Поэтому Lpad - добавляет к дням и месяцам где это требуется 0 слева. Но встала проблема в одном запросе несколько lpad не отрабатывал по причине того, что в FB и IB ghbcencndetn ограничение на вывод строкового результата 64 кб. Что уж там Lpad сотворил, но в моём случае этот лимит был исчерпан и на него база ругалась. Поэтому CAST - преобразовал в варчар длиной в 2. Конкатенируем посредством || и ставим там разделители (у меня ".") назначаем всё это на FDATE. Обращаемся к дате через FDATE. Дата получается вида 00.00.0000. Вуаля, заработало.

Плюс в этом же запросе вы можете запросить все нужные вам поля через запятую, но * в этом случае не работает (а в Mysql работает), условия where пишите в конце какие вам нужны.

Думаю, что кому нибудь это будет полезно. Firebird честно говоря смутил осутствием нормального форматирования даты, (в сравнении с MySql). Во многих местах предлагают писать процедуру либо качать библиотеку для FB c уже написанными для FB функциями форматирования. Но не всегда можно запросто установить библиотеку, поэтому вот такие танцы с бубнами..
 
Сверху