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
ます。代わりに必要な
場合は、サーバーのタイムゾーン設定に従って「ローカル」時間に変換されるを使用できます。または、特定のタイムゾーンの時間を取得するには:timestamp
timestamptz
now()
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の側面をうまくカバーしているようです。