> Здравствуйте.
>
> cast(DAT as varchar(10)) дает что-то типа: '2006-11-07'
>
> Может в Америке это самое оно, но чтобы нормальным русским парням и девкам
> сильно не пугаться и в нормальный вид привести, это либо EXTRACT трижды
> вызывать надо и слипать кусочки, либо конвертацию на клиентской стороне
> производить.
> Может подумать над расширением синтаксиса, чтобы можно было бы указать
> заветные буковки 'DD.MM.YYYY'
>
> что-то типа: cast(DAT as varchar(10) like 'DD.MM.YYYY') --like от балды
> конечно, но почему бы не так?
>
> Надеюсь я тормоз и в ответ получу "в FB2.1 всё будет в лучшем виде" :)))
create procedure FORMAT_TIMESTAMP( -- Форматирование
даты и времени
AMASK varchar(1000), -- Формат (D DD DDD DDDD
M MM MMM MMMM YY YYYY h hh m mm s ss)
ADATETIME timestamp -- Форматируемое
значение
)
returns (
RESULT varchar(1000) -- Результат
форматирования
)
as
declare variable i smallint;
declare variable C varchar(1);
declare variable CC varchar(2);
declare variable CCC varchar(3);
declare variable CCCC varchar(4);
declare variable S varchar(1000);
declare variable SS varchar(1000);
declare variable SSS varchar(1000);
declare variable SSSS varchar(1000);
declare variable STR varchar(1000);
declare variable LEN_SPC smallint;
declare variable D smallint;
declare variable M smallint;
declare variable Y smallint;
declare variable HR smallint;
declare variable MN smallint;
declare variable SC smallint;
declare variable W smallint;
begin
if (:ADATETIME is not null)
then begin
W = extract(weekday from :ADATETIME);
D = extract(day from :ADATETIME);
M = extract(month from :ADATETIME);
Y = extract(year from :ADATETIME);
HR = extract(hour from :ADATETIME);
MN = extract(minute from :ADATETIME);
SC = extract(second from :ADATETIME);
end
i = 1;
if (AMASK is null or AMASK = '')
then AMASK = 'DD.MM.YYYY hh:mm';
STR = AMASK;
RESULT = '';
LEN_SPC = 0;
while (LEN_SPC < 10)
do begin
C = substring(:STR from 1 for 1);
CC = substring(:STR from 1 for 2);
CCC = substring(:STR from 1 for 3);
CCCC = substring(:STR from 1 for 4);
S = substring(:STR from 2 for 1000);
SS = substring(:STR from 3 for 1000);
SSS = substring(:STR from 4 for 1000);
SSSS = substring(:STR from 5 for 1000);
if (C = ' ')
then begin
LEN_SPC = LEN_SPC + 1;
STR = S;
end
else begin
while (LEN_SPC > 0)
do begin
RESULT = RESULT || ' ';
LEN_SPC = LEN_SPC - 1;
end
if (CCCC = 'DDDD' or CCCC = 'MMMM' or CCCC = 'YYYY')
then begin
if (CCCC = 'DDDD')
then begin
if (W = 1) then RESULT = RESULT ||
'Понедельник';
if (W = 2) then RESULT = RESULT ||
'Вторник';
if (W = 3) then RESULT = RESULT ||
'Среда';
if (W = 4) then RESULT = RESULT ||
'Четверг';
if (W = 5) then RESULT = RESULT ||
'Пятница';
if (W = 6) then RESULT = RESULT ||
'Суббота';
if (W = 0) then RESULT = RESULT ||
'Воскресенье';
end
if (CCCC = 'MMMM')
then begin
if (M = 1) then RESULT = RESULT ||
'Январь';
if (M = 2) then RESULT = RESULT ||
'Февраль';
if (M = 3) then RESULT = RESULT ||
'Март';
if (M = 4) then RESULT = RESULT ||
'Апрель';
if (M = 5) then RESULT = RESULT ||
'Май';
if (M = 6) then RESULT = RESULT ||
'Июнь';
if (M = 7) then RESULT = RESULT ||
'Июль';
if (M = 8) then RESULT = RESULT ||
'Август';
if (M = 9) then RESULT = RESULT ||
'Сентябрь';
if (M = 10) then RESULT = RESULT ||
'Октябрь';
if (M = 11) then RESULT = RESULT ||
'Ноябрь';
if (M = 12) then RESULT = RESULT ||
'Декабрь';
end
if (CCCC = 'YYYY') then RESULT = RESULT || Y;
STR = SSSS;
end
else if (CCC = 'DDD' or CCC = 'MMM')
then begin
if (CCC = 'DDD')
then begin
if (W = 1) then RESULT = RESULT ||
'пн';
if (W = 2) then RESULT = RESULT ||
'вт';
if (W = 3) then RESULT = RESULT ||
'ср';
if (W = 4) then RESULT = RESULT ||
'чт';
if (W = 5) then RESULT = RESULT ||
'пт';
if (W = 6) then RESULT = RESULT ||
'сб';
if (W = 0) then RESULT = RESULT ||
'вс';
end
if (CCC = 'MMM')
then begin
if (M = 1) then RESULT = RESULT ||
'Янв';
if (M = 2) then RESULT = RESULT ||
'Фев';
if (M = 3) then RESULT = RESULT ||
'Мар';
if (M = 4) then RESULT = RESULT ||
'Апр';
if (M = 5) then RESULT = RESULT ||
'Май';
if (M = 6) then RESULT = RESULT ||
'Июн';
if (M = 7) then RESULT = RESULT ||
'Июл';
if (M = 8) then RESULT = RESULT ||
'Авг';
if (M = 9) then RESULT = RESULT ||
'Сен';
if (M = 10) then RESULT = RESULT ||
'Окт';
if (M = 11) then RESULT = RESULT ||
'Ноя';
if (M = 12) then RESULT = RESULT ||
'Дек';
end
STR = SSS;
end
else if (CC = 'DD' or CC = 'MM' or CC = 'YY' or CC =
'hh' or CC = 'mm' or CC = 'ss')
then begin
if (CC = 'DD')
then begin
if (D < 10)
then RESULT = RESULT || '0' || D;
else RESULT = RESULT || D;
end
if (CC = 'MM')
then begin
if (M < 10)
then RESULT = RESULT || '0' || M;
else RESULT = RESULT || M;
end
if (CC = 'YY')
then RESULT = RESULT ||
substring(extract(year from :ADATETIME) from 3 for 2);
if (CC = 'hh')
then begin
if (HR < 10)
then RESULT = RESULT || '0' || HR;
else RESULT = RESULT || HR;
end
if (CC = 'mm')
then begin
if (MN < 10)
then RESULT = RESULT || '0' || MN;
else RESULT = RESULT || MN;
end
if (CC = 'ss')
then begin
if (SC < 10)
then RESULT = RESULT || '0' || SC;
else RESULT = RESULT || SC;
end
STR = SS;
end
else if (C = 'D' or C = 'M' or C = 'h' or C = 'm' or C
= 's')
then begin
if (C = 'D') then RESULT = RESULT || D;
if (C = 'M') then RESULT = RESULT || M;
if (C = 'h') then RESULT = RESULT || HR;
if (C = 'm') then RESULT = RESULT || MN;
if (C = 's') then RESULT = RESULT || SC;
STR = S;
end
else begin
RESULT = RESULT || C;
STR = S;
end
end
i = i + 1;
end
suspend;
end
^