Страница 1 из 1
Дату из БД в нормальный вид
Добавлено: 27 фев 2013, 10:48
niteo
Возникла необходимость быстро написать небольшую выгрузку. Вот такая функция очень мне пригодилась. Прошу сильно ногами не пинать, изучал PL/SQL на ходу:
Код: Выделить всё
create or replace function toNormDate(adate in number) return date
is
god char(5);
mes char(3);
den char(3);
begin
if adate < 32 then
return null;
end if;
god := to_char(adate/65536, '9999');
mes := to_char(bitand(adate, 65280)/256, '09');
den := to_char(bitand(adate, 255), '09');
return(to_date(god || '/' || den || '/' || mes, 'YYYY/DD/MM'));
end toNormDate;
Работает достаточно быстро, полагаю можно использовать для выгрузок напрямую из БД!
Re: Дату из БД в нормальный вид
Добавлено: 27 фев 2013, 11:13
Masygreen
ну в sql есть родные функции.. ))
Re: Дату из БД в нормальный вид
Добавлено: 27 фев 2013, 11:16
niteo
Masygreen писал(а):ну в sql есть родные функции.. ))
Озвучьте, а то я голову ломал над форматом даты...
Re: Дату из БД в нормальный вид
Добавлено: 27 фев 2013, 12:24
m0p3e
В оракле:
Код: Выделить всё
FUNCTION GAL."TO_ORADATE" (DATETIME INTEGER) RETURN DATE AS
MM INTEGER; YY INTEGER; TMP INTEGER;
BEGIN
YY := DATETIME / 65536;
TMP := MOD(DATETIME,65536);
MM := TMP / 256;
TMP := MOD(TMP,256);
RETURN TO_DATE(TO_CHAR(TMP)||'.'||TO_CHAR(MM)||'.'||TO_CHAR(YY),'DD.MM.YYYY');
END;
FUNCTION GAL."TO_ATLDATE" (DATETIME DATE) RETURN INTEGER AS
BEGIN
RETURN TO_NUMBER(TO_CHAR(DATETIME,'DD')) + TO_NUMBER(TO_CHAR(DATETIME,'MM')) * 256 + TO_NUMBER(TO_CHAR(DATETIME,'YYYY')) * 65536;
END;
Re: Дату из БД в нормальный вид
Добавлено: 27 фев 2013, 18:36
niteo
m0p3e писал(а):В оракле:
Простите за велосипед
Re: Дату из БД в нормальный вид
Добавлено: 27 фев 2013, 19:20
m0p3e
niteo писал(а):m0p3e писал(а):В оракле:
Простите за велосипед
Мне все равно пришлось ее модифицировать перед использованием, ибо при запросе пустой даты получаем ахтунг.
Код: Выделить всё
FUNCTION GAL.MY_TO_ORADATE --Преобразование даты в формате Галактики (Integer) в формат Оракла без ошибки при 0
(
DATETIME IN INTEGER
) RETURN DATE AS
MM INTEGER;
YY INTEGER;
TMP INTEGER;
BEGIN
IF DATETIME IS NULL
THEN RETURN NULL;
END IF;
IF DATETIME = 0
THEN RETURN NULL;
END IF;
YY := DATETIME / 65536;
TMP := MOD(DATETIME,65536);
MM := TMP / 256;
TMP := MOD(TMP,256);
RETURN TO_DATE(TO_CHAR(TMP)||'.'||TO_CHAR(MM)||'.'||TO_CHAR(YY),'DD.MM.YYYY');
END;
Re: Дату из БД в нормальный вид
Добавлено: 28 фев 2013, 22:00
Max_Fin
Велосипед 2
Код: Выделить всё
FUNCTION "TO_ORADATEMY"(DATETIME INTEGER)
RETURN DATE AS
MM INTEGER;
YY INTEGER;
TMP INTEGER;
DT date;
BEGIN
begin
DT:=null;
YY := DATETIME / 65536;
TMP := MOD(DATETIME, 65536);
MM := TMP / 256;
TMP := MOD(TMP, 256);
DT:= TO_DATE(TO_CHAR(TMP) || '.' || TO_CHAR(MM) || '.' || TO_CHAR(YY),
'DD.MM.YYYY');
exception when oThers then
dt:=null;
end;
RETURN dt;
END;