Дату из БД в нормальный вид

База знаний

Модераторы: m0p3e, edward_K, Модераторы

Ответить
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Дату из БД в нормальный вид

Сообщение 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;
Работает достаточно быстро, полагаю можно использовать для выгрузок напрямую из БД!
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Дату из БД в нормальный вид

Сообщение Masygreen »

ну в sql есть родные функции.. ))
Время ведет!
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Re: Дату из БД в нормальный вид

Сообщение niteo »

Masygreen писал(а):ну в sql есть родные функции.. ))
Озвучьте, а то я голову ломал над форматом даты...
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Дату из БД в нормальный вид

Сообщение 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;
niteo
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 17 сен 2009, 11:39
Контактная информация:

Re: Дату из БД в нормальный вид

Сообщение niteo »

m0p3e писал(а):В оракле:
Простите за велосипед :)
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Дату из БД в нормальный вид

Сообщение 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;
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Re: Дату из БД в нормальный вид

Сообщение 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;
Жду выхода Вселенная 2.12!
Ответить