> Здравствуйте. > > 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 ^