如何在 postgresql 上使用 unix 时间戳
how work with unix timestamp on postgresql
我必须使用 postgres 数据库 9.4,并且我想使用时间戳。
第一个 'problem' 是当我在 postgres 上创建一个时间戳列时,我不知道它在内部做了什么但是当我查询它时 returns '2010-10-30 00:00:00'
对我来说,时间戳是这样的 12569537329(unix 时间戳)。
我这么说是因为是整数或者浮点数,计算机处理起来比字符串容易多了,而且每个国家都有自己的时间格式,unix时间戳就是一个数字,故事结束。
从 php 查询结果是一个字符串,所以我不得不做一堆杂耍,并且由于时区、夏令时和其他事情可能会出错。
我搜索了很多,但找不到在 postgresql 上使用 unix 时间戳的方法。
有人可以解释一下是否有办法或正确的工作方式并尽可能接近 unix 时间戳。
更新
我发现它会帮助我的一件事,我花了很长时间才发现它在 postgresql 上是可能的,那就是改变 Interval Output.
在 php 中,月份的日期间隔是 'month',对于 pg 是 'mon' php 它将把星期一理解为星期一。
我认为如果你不得不兼顾太多,那你就做错了。
很高兴 postgres 让我们改变会话或永久的行为。
所以将 intervalstyle
设置为 iso_8601
它将作为 php iso_8601 工作并输出 P1M
只需将 unix time_t
to/from 转换为时间戳,然后在 postgres 中使用它:
CREATE TABLE omg
( seq SERIAL NOT NULL PRIMARY KEY
, stampthing TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO omg(stampthing) SELECT now();
INSERT INTO omg(stampthing) VALUES
('epoch'::timestamptz )
, ('epoch'::timestamptz + 12569537329 * '1 second'::interval)
;
SELECT stampthing
, DATE_PART('epoch',stampthing) AS original
FROM omg;
输出:
CREATE TABLE
INSERT 0 1
INSERT 0 2
stampthing | original
-------------------------------+------------------
2016-01-20 16:08:12.646172+01 | 1453302492.64617
1970-01-01 01:00:00+01 | 0
2368-04-24 20:08:49+02 | 12569537329
(3 rows)
如果您只查询 postgres 中的时间戳列,您将获得格式化的日期。如果您更喜欢 unix 时间戳整数,您可以在 return 时使用
之类的语法来转换它
select extract(epoch from '2011-11-15 00:00:00+01'::timestamp with time zone)::integer;
如果你经常这样做,你可以用摘录做一个视图。
或者您可以将时间戳列定义为整数并使用 extract()
存储数据
我必须使用 postgres 数据库 9.4,并且我想使用时间戳。 第一个 'problem' 是当我在 postgres 上创建一个时间戳列时,我不知道它在内部做了什么但是当我查询它时 returns '2010-10-30 00:00:00'
对我来说,时间戳是这样的 12569537329(unix 时间戳)。
我这么说是因为是整数或者浮点数,计算机处理起来比字符串容易多了,而且每个国家都有自己的时间格式,unix时间戳就是一个数字,故事结束。
从 php 查询结果是一个字符串,所以我不得不做一堆杂耍,并且由于时区、夏令时和其他事情可能会出错。
我搜索了很多,但找不到在 postgresql 上使用 unix 时间戳的方法。
有人可以解释一下是否有办法或正确的工作方式并尽可能接近 unix 时间戳。
更新
我发现它会帮助我的一件事,我花了很长时间才发现它在 postgresql 上是可能的,那就是改变 Interval Output.
在 php 中,月份的日期间隔是 'month',对于 pg 是 'mon' php 它将把星期一理解为星期一。
我认为如果你不得不兼顾太多,那你就做错了。
很高兴 postgres 让我们改变会话或永久的行为。
所以将 intervalstyle
设置为 iso_8601
它将作为 php iso_8601 工作并输出 P1M
只需将 unix time_t
to/from 转换为时间戳,然后在 postgres 中使用它:
CREATE TABLE omg
( seq SERIAL NOT NULL PRIMARY KEY
, stampthing TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO omg(stampthing) SELECT now();
INSERT INTO omg(stampthing) VALUES
('epoch'::timestamptz )
, ('epoch'::timestamptz + 12569537329 * '1 second'::interval)
;
SELECT stampthing
, DATE_PART('epoch',stampthing) AS original
FROM omg;
输出:
CREATE TABLE
INSERT 0 1
INSERT 0 2
stampthing | original
-------------------------------+------------------
2016-01-20 16:08:12.646172+01 | 1453302492.64617
1970-01-01 01:00:00+01 | 0
2368-04-24 20:08:49+02 | 12569537329
(3 rows)
如果您只查询 postgres 中的时间戳列,您将获得格式化的日期。如果您更喜欢 unix 时间戳整数,您可以在 return 时使用
之类的语法来转换它select extract(epoch from '2011-11-15 00:00:00+01'::timestamp with time zone)::integer;
如果你经常这样做,你可以用摘录做一个视图。
或者您可以将时间戳列定义为整数并使用 extract()
存储数据