правильный формат даты в ХП - DD.MM.YYYY

Модераторы: kdv, CyberMax

Ответить
break
Сообщения: 58
Зарегистрирован: 12 май 2005, 11:03

правильный формат даты в ХП - DD.MM.YYYY

Сообщение break » 12 апр 2007, 17:51

Внутри хранимой процедуры соединяю VARCHAR поле с полем DATE
...
OPERATIONS_INFO = :OP_SHORT_NAME || ' ' || :V_OP_DATE;
...
- как сделать чтобы поле DATE было в правильном формате DD.MM.YYYY

сам FB по умолчанию делает формат YYYY.MM.DD

Обязательно использовать UDF???

break
Сообщения: 58
Зарегистрирован: 12 май 2005, 11:03

Сообщение break » 12 апр 2007, 17:57

о!! сделал так:

EXTRACT(DAY from :V_OP_DATE) || '.' ||
EXTRACT(MONTH from :V_OP_DATE) || '.' ||
EXTRACT(YEAR from :V_OP_DATE) ||

Может есть еще варианты ???

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 12 апр 2007, 19:10

Есть. Но этот имхо лучший.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 13 апр 2007, 07:42

Вообще-то для третьего диалекта преобразование даты в строку определяется SQL стандартом и дает YYYY-MM-DD. Как автор умудрился получить точки в качестве разделителя - загадка.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 апр 2007, 11:44

Я думаю он получил именно то, что ты говоришь, а написал со своими, т.к. основное внимание сосредоточил на порядке вывода годов-месяцев-дней.

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 13 апр 2007, 13:55

break писал(а):Может есть еще варианты ???
Можно ещё так:

Код: Выделить всё

substring(current_date from 9 for 2)||'.'||
substring(current_date from 6 for 2)||'.'||
substring(current_date from 1 for 4)
...не теряются нолики.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 15 апр 2007, 12:05

нолики можно и добавить =)

Код: Выделить всё

CREATE PROCEDURE LPAD (
    str varchar(60),
    count_ integer,
    substr varchar(10))
returns (
    result varchar(60))
as
begin
/* Дополнение строки слева (LPAD)

Функция Дополнение строки слева заданными символами.
Спецификация
LPAD (<строка>, <длина> [, <подстрока> ])
<строка> ::= <значимое символьное выражение>
<длина> ::= <значимое числовое выражение>
<подстрока> ::= <значимое символьное выражение>
Общие правила
   1. <Строка> дополняется слева указанной в <подстроке> последовательностью символов до указанной <длины> (возможно, с повторением последовательности).
   2. Если <подстрока> не указана, то по умолчанию <строка> дополняется пробелами.
   3. Если <длина> меньше длины <строки>, то исходная <строка> усекается до заданной <длины>.
   4. Если длина <подстроки> больше чем указанная <длина>, то <строка> дополняется частью <подстроки>.
Возвращаемое значение
<Строка>, дополненная слева указанными последовательностями символов. Длина <строки>- максимум из исходной длины <строки> и <длины>.*/
  result = substring(:str from 1 for :count_);
  while (char_length(:result) < :count_) do
      result = :substr || :result;
  suspend;
end

break
Сообщения: 58
Зарегистрирован: 12 май 2005, 11:03

Сообщение break » 15 апр 2007, 23:36

-->Как автор умудрился получить точки в качестве разделителя - загадка.

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

Всем спасибо, понравился вариант Slavik-а так-как нолики с меня потом потребовали конечные пользователи - мол не стандартная дата у тебя в программе.

сам я сделал так:

Код: Выделить всё

CREATE PROCEDURE SP_CORRECT_DATE(
    A_DATE DATE)
RETURNS (
    XDATE VARCHAR(10))
AS
declare variable V_DAY varchar(2);
declare variable V_MONTH varchar(2);
declare variable V_NUM integer;
begin

  V_NUM = EXTRACT(DAY from :A_DATE);
  if (:V_NUM < 10) then
    begin
      V_DAY = '0' || :V_NUM;
    end
  else
    begin
      V_DAY = :V_NUM;
    end

  V_NUM = EXTRACT(MONTH from :A_DATE);
  if (:V_NUM < 10) then
    begin
      V_MONTH = '0' || :V_NUM;
    end
  else
    begin
      V_MONTH = :V_NUM;
    end

  XDATE = V_DAY || '.' || V_MONTH || '.' || EXTRACT(YEAR from :A_DATE);

  suspend;
end
но его вариант лучше.

Ответить