Извлечение из date_time_iddoc времени в PostgreSQL.

Кто знаком с 1С, тот знает, что при работе требуется определять дату и время документа. Однако при извлечении времени напрямую из СУБД возникают некоторые неудобства.

Например date_time_iddoc=‘201402127JE8E8 108QBS16’. С извлечением даты еще понятно - 2014-02-12, а вот время ‘7JE8E8’ хранится в 36 системе исчисления. Как говорят в таких случаях - будем работать с тем что имеем.

Поиск встроенных функций перевода я не нашел, а вот написать пришлось. Хочу поделится с вами решением на “plpgsql”.
Имеем данные:

CREATE TABLE test.test
(
  iddoc_date_time text
);
INSERT INTO test.test(iddoc_date_time) VALUES ('201402127JE8E8 108QBS16');
INSERT INTO test.test(iddoc_date_time) VALUES ('201402127AC8A8 108KXS20');
INSERT INTO test.test(iddoc_date_time) VALUES ('20140212C0FCDS 109HLE01');
INSERT INTO test.test(iddoc_date_time) VALUES ('201402128HUDGG 108U9S16');
INSERT INTO test.test(iddoc_date_time) VALUES ('201402129R3YKW 1096OS03');
INSERT INTO test.test(iddoc_date_time) VALUES ('2014021278ZSGG 108I1S08');

Вот рабочий скрипт:

CREATE OR REPLACE FUNCTION get_data_time(IN dts text) 
RETURNS timestamp without time zone AS
$$
DECLARE  S_Date timestamp;
DECLARE  STime text;
DECLARE  i integer;
DECLARE  s integer;
DECLARE  t integer;
DECLARE  dt timestamp without time zone;
BEGIN
   S_Date = cast( SUBSTRING(dts,1,8) as timestamp);
   STime =  SUBSTRING(dts,9,6);
	t = 0;
  FOR i in SELECT GENERATE_SERIES(1, 7)
  LOOP
  	s = position(SUBSTRING(STime,i,1) in '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
  	t = t+(s-1)*POWER(36,(7-i-1));
  	i = i+1;
  END LOOP;
  dt = S_Date + t/10000 * INTERVAL '1 second';
  return dt;
END
$$
LANGUAGE plpgsql;

Создаем хранимую процедуру и делаем расчет. Вывод на тестовом множестве:result

Ссылки на материалы:

  1. Дата + Время из date_time_iddoc http://www.abelov.com/kuban/151284.html