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