Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在postgresql上使用unix时间戳_Php_Postgresql_Unix Timestamp - Fatal编程技术网

Php 如何在postgresql上使用unix时间戳

Php 如何在postgresql上使用unix时间戳,php,postgresql,unix-timestamp,Php,Postgresql,Unix Timestamp,我必须使用postgres数据库9.4,我想使用时间戳。 第一个“问题”是,当我在postgres上创建时间戳列时,我不知道它在内部做什么,但当我查询时,它返回“2010-10-30 00:00:00” 对我来说,时间戳类似于12569537329(unix时间戳) 我说,因为是一个整数或浮点数,计算机处理起来比字符串容易,每个国家都有自己的时间格式,unix时间戳是一个数字,故事就到此为止 从php查询结果是一个字符串,所以我不得不做一些杂耍,因为时区,日光节约和其他一些事情可能会出错 我搜索

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

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

我说,因为是一个整数或浮点数,计算机处理起来比字符串容易,每个国家都有自己的时间格式,unix时间戳是一个数字,故事就到此为止

从php查询结果是一个字符串,所以我不得不做一些杂耍,因为时区,日光节约和其他一些事情可能会出错

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

有人能解释一下,是否有一种方法,或者说是正确的方法来工作并尽可能接近unix时间戳吗

更新

我发现有一件事对我有帮助,而且花了很长时间才发现在postgresql上是可能的,那就是更改间隔输出

在php中,月份的日期间隔是'month',而在php中,pg是'mon',它将把mon理解为周一。 我认为如果你不得不做太多的杂耍,那你就是做错了。 很高兴博士后让我们改变这种行为的会议或永久。
因此,将
intervalstyle
设置为
iso_8601
它将起作用,并将输出
P1M

,只需将unix时间转换为时间戳,并在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时间戳整数,则可以在返回时使用如下语法强制转换它

select extract(epoch from '2011-11-15 00:00:00+01'::timestamp with time zone)::integer;
如果您经常这样做,您可以使用摘录创建视图


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

请准确显示如何获得显示的结果。PG实际上使用Unix的
gettime()
函数作为其
timestamp
s,并且它对时区和DST有极好的支持。举例说明你的问题,你会得到答案。现在这不是一个具体的问题,我遇到了很多问题。我记忆犹新的一件事是这个。我的数据库上有一个日期,2015/08/31 23:00:00,但我不知道它是否已经转换为时区,或者是否有人弄乱了代码并用错误的时区保存。时间戳是绝对的,有了这些信息,我就把时区传递给一个php函数,并确切地知道如何处理这些信息。人们往往喜欢这种格式“2015/08/31 23:00:00”,因为“我能看得懂”,但我更关心的是有可靠的信息。PG既有
时间戳
也有
时区时间戳
数据类型。第二个始终存储在UTC中,可以在您喜欢的任何时区显示,本地时间将是正确的。第一个与服务器位于同一时区。您描述的问题更多的是用户级的数据管理,而不是数据库相关的。@Patrick是的,我正试图修复另一个开发人员造成的混乱,并试图在将来防止。我在谷歌搜索中看到了很多这方面的问题,但当我尝试使用一个专栏时,我总是会遇到一个错误。这不完全是我想要的,但它会起作用,我不熟悉postgres,我的意愿是将php时间戳保存为db上的整数,但我现在知道这不是最佳做法。实时日期/时间类型的优点是对它的操作相对容易。添加几天,找出时间戳是否在特定的月份或年份内,等等,所有这些都包括校正闰日和闰秒(以及时区)。输入/输出(需要时)是可能的;看看我的答案。