PostgreSQLのデータ型はtimestampまたtimestamp with time zoneはです。しかし、それはあなたがしていることと矛盾します。エポック値を取得し、1000を掛けます。それをintegerまたは数値タイプとして保存する必要があります。
この関連する回答で、Postgresでのタイムスタンプの処理について詳しく説明します。
値をそのまま保存しますtimestamp with time zone(乗算なし)。必要に応じて、いつでもmsを抽出できます。
Unixエポック値をタイムスタンプに戻す必要がある場合は、次を使用します。
SELECT to_timestamp(1352633569.151);
--> timestamptz 2012-11-11 12:32:49.151+01
「今」を保存するだけ
実際に「今」、つまり現在の時点を保存したい場合は、Postgresに任せてください。データベースサーバーに信頼できる現地時間が存在することを確認してください-ntpをインストールします。これは一般的に、より信頼性が高く、正確で、単純です。
DEFAULTタイムスタンプ列のをnow()またはに設定しCURRENT_TIMESTAMPます。代わりに必要な
場合は、サーバーのタイムゾーン設定に従って「ローカル」時間に変換されるを使用できます。または、特定のタイムゾーンの時間を取得するには:timestamptimestamptznow()
now() AT ZIME ZONE 'Europe/Vienna' -- your time zone here
または、特定のケースでは、3桁の小数桁のみが必要なように見えるため、now()::timestamp(3)またはCURRENT_TIMESTAMP(3)またはCURRENT_TIMESTAMP(3) AT ZIME ZONE 'Europe/Vienna'。
または、列のタイプをとして定義するとtimestamp(3)、すべてのタイムスタンプ値がタイプに強制変換され、小数点以下3桁に自動的に丸められます。
したがって、必要なのはこれだけです。
CREATE TABLE tbl (
-- other columns
,ts_column timestamp(3) DEFAULT now()
);
値は自動的にオンINSERTに設定されます。列について言及する必要はありません。
更新する場合は、次のようなトリガーON UPDATEを追加します。
トリガー機能:
CREATE OR REPLACE FUNCTION trg_up_ts()
RETURNS trigger AS
$BODY$
BEGIN
NEW.ts_column := now();
RETURN NEW;
END
$BODY$ LANGUAGE plpgsql VOLATILE
引き金:
CREATE TRIGGER log_up_ts
BEFORE UPDATE ON tbl
FOR EACH ROW EXECUTE PROCEDURE trg_up_ts();
これで、すべてが自動的に機能します。
それがあなたが求めているものではない場合、@slivuの答えはRubyの側面をうまくカバーしているようです。