【问题标题】:how work with unix timestamp on postgresql如何在 postgresql 上使用 unix 时间戳
【发布时间】:2016-01-20 13:47:05
【问题描述】:

我必须使用 postgres 数据库 9.4,并且我想使用时间戳。 第一个“问题”是,当我在 postgres 上创建时间戳列时,我不知道它在内部做什么,但是当我查询它时返回 '2010-10-30 00:00:00'

对我来说,时间戳类似于 12569537329(unix 时间戳)。

我说因为是整数或浮点数,计算机处理起来比字符串容易得多,而且每个国家都有自己的时间格式,unix时间戳是一个数字和故事的结尾。

从 php 查询结果是一个字符串,所以我必须做一堆杂耍,并且由于时区、夏令时和其他一些事情可能会出错。

我搜索了很多,但找不到在 postgresql 上使用 unix 时间戳的方法。

有人可以解释一下是否有办法,或者正确的工作方式,并尽可能接近 unix 时间戳。

更新

我发现它会帮助我的一件事是改变 间隔输出

pg manual

在 php 中,月份的日期间隔是“月”,因为 pg 在 php 上是“星期一”,它会将星期一理解为星期一。 我认为,如果你不得不玩太多杂耍,那你就做错了。 很高兴 postgres 让我们为会话或永久更改该行为。 因此将intervalstyle 设置为iso_8601 它将作为php iso_8601 工作,并将输出P1M

【问题讨论】:

  • 请准确展示您为获得您展示的结果所做的工作。 PG 实际上使用 Unix gettime() 函数作为其 timestamps 并且它对时区和 DST 有很好的支持。用例子让你的问题更具体,你就会得到答案。
  • 现在这不是一个具体的问题,这是我遇到的很多事情。我记忆犹新的一件事就是这个。我的数据库上有一个日期,2015/08/31 23:00:00 但只是我不知道是否已经使用时区转换,或者是否有人弄乱了代码并使用错误的时区保存。时间戳是绝对的,有了这些信息,我将时区传递给一个 php 函数,并确切地知道如何处理这些信息。人们倾向于喜欢这种格式“2015/08/31 23:00:00”,因为“我可以看懂”,但我更关心是否有可靠的信息。
  • PG 同时具有timestamptimestamp with time zone 数据类型。秒始终以 UTC 存储,可以在您喜欢的任何时区显示,本地时间将是正确的。第一个与服务器位于同一时区。您描述的问题更多是用户级别的数据管理,而不是与数据库相关的。
  • @Patrick 是的,我正在尝试修复另一个开发人员造成的混乱,并尝试在将来防止。

标签: php postgresql unix-timestamp


【解决方案1】:

只需将 unix time_t 转换为时间戳,然后在 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,我的意愿是将 php 时间戳保存为数据库上的整数,但我现在认为这不是最佳实践。
  • 真实日期/时间类型的优点是操作相对容易。添加几天,找出时间戳是否在特定月份或年份等。所有这些都包括更正闰日和闰秒(和时区)。并且输入/输出(在需要时)是可能的;看我的回答。
【解决方案2】:

如果你只是在 postgres 中查询一个时间戳列,你会得到一个格式化的日期。如果您更喜欢 unix 时间戳整数,则可以在返回时使用

之类的语法对其进行转换
select extract(epoch from '2011-11-15 00:00:00+01'::timestamp with time zone)::integer;

如果你经常这样做,你可以用提取物制作一个视图。

或者您可以将时间戳列定义为整数并使用 extract() 存储数据

【讨论】:

  • 我在谷歌搜索中看到了很多,但是当我尝试与列一起使用时,我总是得到一个错误
猜你喜欢
  • 1970-01-01
  • 2014-08-28
  • 2012-04-27
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
相关资源
最近更新 更多