2016-08-23 5 views
-2

У меня есть функция в postgreSQL, которая возвращает 0 или 1 в соответствии с ее параметрами, и у меня есть метод, который обращается к этому funtion, но когда я запускаю, я получаю ошибку, у меня возникают проблемы с настройкой текущего дата в метках времени. Я попытался добавить шаблон с simpleDataFormat и многое другое, но я не мог этого сделать. Заранее спасибо!Получить сегодняшнюю дату в Timestamp

ERROR: function inserir_posicao(numeric, bigint, double precision, double precision, numeric) does not exist 
    Dica: No function matches the given name and argument types. You might need to add explicit type casts. 

Funtion в дб:

CREATE OR REPLACE FUNCTION public.inserir_posicao(
    _tag bigint, 
    _data_hora timestamp without time zone, 
    _lat double precision, 
    _long double precision, 
    _gado_id bigint) 
    RETURNS integer AS 
$BODY$declare 
    tagPesq BigInt; 
begin 

    select tag into tagPesq from coordenadas where tag = $1; 
    if tagPesq is not null and tagPesq > 0 then 
    update coordenadas set pos_data = $2, 
    pos_latitude = $3, 
    pos_longitude = $4, 
    gado_id = $5 
    where tag_id = $1; 
    else 
    insert into coordenadas(pos_data,pos_latitude,pos_longitude, 
    tag_id, gado_id) values ($2,$3,$4,$1,$5); 
    end if; 

    return 1; 

    EXCEPTION WHEN RAISE_EXCEPTION THEN 
    BEGIN 
    return 0; 
    END; 
end;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION public.inserir_posicao(bigint, timestamp without time zone, double precision, double precision, bigint) 
    OWNER TO postgres; 

Метод:

public int inserirPosicao(BigInteger tagId, BigInteger gadoId, double lat, double lon) { 
     Timestamp timestamp = new Timestamp(System.currentTimeMillis()); 


     Query qry = manager.createNativeQuery("select inserir_posicao(:tag,:data,:lat,:lng,:gado)"); 
     qry.setParameter("tag", tagId); 
     qry.setParameter("data", timestamp.getTime()); 
     qry.setParameter("lat", lat); 
     qry.setParameter("lng", lon); 
     qry.setParameter("gado", gadoId); 
     return (int) qry.getSingleResult(); 
    } 
+1

Возможный дубликат [получить время без часового пояса в Java] (http://stackoverflow.com/questions/39106041/get-time-without-time -zone-in-java) –

+0

Ваша проблема в этой строке: qry.setParameter («данные», timestamp.getTime()); пожалуйста, проверьте мой ответ. – Christian

ответ

1

Ваша проблема в этой строке:

qry.setParameter("data", timestamp.getTime()); 

Метод getTime() возвращает дату/время miliseconds s ince 01/01/1970, который является большим числом. Но ваша функция ожидает значение временной метки, поэтому вы получите эту ошибку, о которой вы говорили.

Решение:

Вы должны пройти «даты/времени» значение как отформатированные строки, как «гггг-мм-дд HH24: MI: SS», а затем установите параметр в виде строки .. .

... или если вы хотите еще пропусканием дату в миллисекундах, вы должны «преобразовать» этот BigInt номер, дату/время, изменив строку:

Query qry = manager.createNativeQuery("select inserir_posicao(:tag,:data,:lat,:lng,:gado)"); 

к

Query qry = manager.createNativeQuery("select inserir_posicao(:tag, to_timestamp(:data/1000) ,:lat,:lng,:gado)"); 

Причина, почему мы должны разделить :data на 1000 потому, что to_timestamp ожидает количество секунд начиная с 01/01/1970, и вы передаете количество миллисекунд.

Доступна функция с одним аргументом to_timestamp; он принимает аргумент двойной точности и преобразует из эпохи Unix (секунды с 1970-01-01 00: 00: 00 + 00) в метку времени с часовым поясом. (Integer Unix эпохи неявно приводится к двойной точности.)

+0

Спасибо за вашу помощь Кристиан! Я понял.] –

Смежные вопросы