2016-08-23 8 views
-2

私はpostgreSQLのパラメータに従って0または1を返す関数を持っていますが、この関数にアクセスするメソッドがありますが、実行するとエラーが発生し、現在の設定に問題がありますタイムスタンプの日付。私はsimpleDataFormatなどのパターンを追加しようとしましたが、それ以外の多くのことはできませんでした。前もって感謝します!デシベルでタイムスタンプで今日の日付を取得する

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. 

目的球:

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

可能な複製(http://stackoverflow.com/questions/39106041/get-time-without-time -zone-in-java) –

+0

問題は次の行にあります。qry.setParameter( "data"、timestamp.getTime());私の答えをチェックしてください。 – Christian

答えて

1

あなたの問題は、この行である:

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

に日付/時刻を返しますgetTime()方法ミリ秒in 01 01/1970、これは大きな整数です。しかし、あなたの関数はタイムスタンプ値を期待しているので、あなたはこのエラーを受け取ります。

ソリューション:

あなたは "YYYY-MM-DD HH24:MI:SS" のようにフォーマットされた文字列として "日付/時刻" の値を渡す必要があり、その後、文字列としてパラメータを設定します。.. 。

...またはあなたはまだミリ秒単位で日付を渡したい場合は、あなたが行を変更することで、日付/時刻にこのBIGINT番号を「変換」する必要があります。

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

は、1970年1月1日からの秒数を期待して、あなたがミリ秒数を渡しているので、我々は1000:dataを分割する必要があり

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

理由があります。

単一引数のto_timestamp関数も使用できます。 倍精度引数を受け取り、Unixエポック(1970年1月1日00:00:00 + 00以降の秒 )からタイムゾーン付きタイムスタンプに変換します。 [Javaでのタイムゾーンのない時間を取得]の(整数 のUnixエポックは、暗黙的に倍精度にキャストされている。)

+0

あなたの助けに感謝クリスチャン!わかった。] –

関連する問題