加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL的圆形时间戳为秒,为postgres预先创建的日期,以毫秒为

发布时间:2020-12-13 15:56:30 所属栏目:百科 来源:网络整理
导读:我有一个查询,不幸的是必须比较2个时间戳.从 PHP date()函数给DB一个时间戳,存储为没有时区的时间戳,因此这个日期没有添加毫秒数.另一个是带时区的PG时间戳.因此,两个日期已经创建并插入表中,以下是日期的示例: 没有时区的时间戳= 2012-09-19 18:13:26 PG的
我有一个查询,不幸的是必须比较2个时间戳.从 PHP date()函数给DB一个时间戳,存储为没有时区的时间戳,因此这个日期没有添加毫秒数.另一个是带时区的PG时间戳.因此,两个日期已经创建并插入表中,以下是日期的示例:

没有时区的时间戳= 2012-09-19 18:13:26

PG的时区时间戳= 2012-09-19 18:13:26.893878-04

我可以投射PG date :: timestamp(0)让我接近,但正如预期的那样,日期被四舍五入; 2012-09-19 18:13:27

所以我的问题是我如何才能获得倒数秒?

解决方法

比较时间戳的平等很少能够很好地运作.如果两个时间戳是在2012-09-19 18:13:26.99999999拍摄的,该怎么办?时钟抖动,调度程序抖动,执行时间差异等可能并且经常会将其推到下一秒.它也不一定要接近边缘.你可以试试黑客

相反,在较窄的范围内;说2秒:

SET timezone = '+04:00';

SELECT (TIMESTAMP '2012-09-19 18:13:26')::timestamptz 
       BETWEEN TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' - INTERVAL '1' SECOND 
           AND TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' + INTERVAL '1' SECOND;

我不确定你可以使用比这更粗糙的东西,因为你的PHP时间戳的精度是1秒.

如果您确定PHP总是截断时间戳(向下舍入)而不是舍入到即使它捕获时间戳,您也可以通过调整包围间隔来粗略地校正它.例如,尝试1秒间隔(您可以测试给定的PHP时间戳精度最窄)尝试,并假设PHP总是截断时间戳:

SELECT (TIMESTAMP '2012-09-19 18:13:26')::timestamptz 
       BETWEEN TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' - INTERVAL '1' SECOND 
           AND TIMESTAMPTZ '2012-09-19 18:13:26.893878-04';

就个人而言,我要确保每侧至少再增加0.1秒:

SELECT (TIMESTAMP '2012-09-19 18:13:26')::timestamptz 
       BETWEEN TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' - INTERVAL '1.1' SECOND 
           AND TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' + INTERVAL '0.1' SECOND;

如果你真的坚持测试平等,请使用:

regress=# SELECT date_trunc('second',TIMESTAMPTZ '2012-09-19 18:13:26.893878-04');
       date_trunc       
------------------------
 2012-09-19 18:13:26-04
(1 row)

但请注意,测试两个单独捕获的时间戳是否相等是危险和错误的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读