Страница 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;