Извлечение из 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;
Создаем хранимую процедуру и делаем расчет. Вывод на тестовом множестве:
Ссылки на материалы:
- Дата + Время из date_time_iddoc http://www.abelov.com/kuban/151284.html
- Подробности
- Опубликовано: 09 Март 2014
- Просмотров: 4146