PostgreSQL 数据类型将是timestamp
或timestamp with time zone
。但这与你正在做的事情相矛盾。您将 epoch 值乘以 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
或者,在您的特定情况下,因为您似乎只需要三个小数:now()::timestamp(3)
or CURRENT_TIMESTAMP(3)
or 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 方面。