2016-08-23 8 views
0

У меня есть функция в postgreSQL, которая имеет время без столбца временной зоны. Затем в моем методе я получаю сообщение об ошибке при настройке параметра. Он говорит, что тип неизвестен. Как установить этот параметр с текущим системным временем? Цель метода - проверить, существует ли регистр или нет в БД.получить время без часового пояса в Java

Функция:

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, time with time zone, double precision, double precision, bigint) 
    OWNER TO postgres; 

Метод:

public int insertPosicao(BigInteger tagId, BigInteger gadoId, double lat, double lon) { 

     Query qry = manager.createNativeQuery("select inserir_posicao(:tag,:data,:lat,:lng,:gado)"); 
     qry.setParameter("tag", tagId); 
     qry.setParameter("data", ???); //this parameter. 
     qry.setParameter("lat", lat); 
     qry.setParameter("lng", lon); 
     qry.setParameter("gado", gadoId); 
     return (int) qry.getSingleResult(); 
    } 
+2

_ «У меня есть функция в postgreSQL» _ - покажите нам функцию. Какого типа он ожидает? Пожалуйста, посетите [help] и прочитайте [ask], чтобы узнать, как эффективно использовать StackOverflow. –

+0

показывается. –

ответ

1

UMH вы могли бы использовать что-то вроде

SimpleDateFormat sdf = new SimpleDateFormat(**pattern**); 
String sData = sdf.format(GregorianCalendar.getInstance()); 
qry.setParameter("date",sData); 

, где вы должны указать вам шаблон

В моем коде я положил GregorianCalendar.getInstance, которые возвращают текущее время. Вы также можете достичь этого с помощью только sysdate по запросу. На вашей функции, на

pos_data = $2 вы должны установить pos_data=to_date($2,**pattern**), потому что теперь, вы передать строку обозначает дату и с помощью Postgres функции вы Transfor его в дату

Смотри также: SimpleDateFormat и to_date PostgreSQL

+0

спасибо! но что мне делать с этим «to_date»? –

+0

Извините, отредактированный с правильным ответом –

+0

Я использовал первые три строки, которые вы написали. Должно ли это быть правильным? потому что я получаю ошибку: невозможно форматировать данный объект как дату –

1

Вы можно использовать следующее, только в Java 8, чтобы получить локальное смещение времени по Гринвичу и без зоны:

String ldt = Instant.now().atOffset(ZoneOffset.UTC).toLocalDateTime().toString(); 
qry.setParameter("data",ldt); 

Если у вас есть свой срок, вы может использовать тот же код, просто замените Instant.now() на Instant.parse(date), хотя он должен быть отформатирован правильно.

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