如何对具有纪元值的列进行 JOIN 查询,忽略 postgres 中的时间部分

Posted

技术标签:

【中文标题】如何对具有纪元值的列进行 JOIN 查询,忽略 postgres 中的时间部分【英文标题】:How to do JOIN query on column having epoch value ignoring the time part in postgres 【发布时间】:2021-02-05 17:55:10 【问题描述】:

我有两个表,比如说 tableA 和 tableB ,这两个表都有一个列 creation_date ,其中包含 epoch 值。我想在 creation_date 加入这两个表,忽略其中的时间值。

假设 epoch 值是否为 1603385466134,即转换为 Thu Oct 22 2020 22:21:06。现在加入应该是Thu Oct 22 2020 00:00:00

我试过了,但没用

Select t.lr_transaction_id, t.unique_customer_id, t.transaction_id 
from boidcrewardz.transaction_temp t 
 join boidcrewardz.transaction_dump d 
  on  t.first_6_digit_card = d.first_6_digit_card 
 and  t.transaction_amount = d.transaction_amount 
  and date_trunc('day',t.transaction_date) = date_trunc('day',d.transaction_date)  
order by t.creation_date desc

【问题讨论】:

不确定我是否得到“忽略时间价值”部分 - 你的意思是加入应该发生在 Thu Oct 22 2020 00:00:00 还是你所说的时间? 您的翻译似乎在特定时区。哪一个? @PhilippJohannis 是的,我编辑了我的帖子,它应该发生在Thu Oct 22 2020 00:00:00 并使用 IST 时区 date_trunc() 仅适用于 timestampdate 值,不适用于 bigint 值 - 至少在 Postgres 中。你在用什么? Postgres 还是 Greenplum? 【参考方案1】:

Postgres 9 及更高版本支持to_timestamp():

to_timestamp ( 双精度 ) → 带时区的时间戳

将 Unix 纪元(自 1970-01-01 00:00:00+00 以来的秒数)转换为时间戳 有时区

to_timestamp(1284352323) → 2010-09-13 04:32:03+00

Postgres 8 支持SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 1603385466.134 * INTERVAL '1 second'

您只需要将 epoch 值除以 1000.00,因为您的 epoch 以毫秒为单位,而 Postgres 预计为秒。

以下其中一项应该有效:

select date_trunc('day',to_timestamp(1603385466134/1000.00));

SELECT date_trunc('day',TIMESTAMP WITH TIME ZONE 'epoch' + 1603385466134/1000.00 * INTERVAL '1 second');

【讨论】:

以上是关于如何对具有纪元值的列进行 JOIN 查询,忽略 postgres 中的时间部分的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中对具有空值的列求和

在执行 Select 查询时,如何忽略 Postgresql 中某列具有特定值的数据行?

对所有具有 null 的列进行取消透视

Spark SQL中Dataframe join操作含null值的列

将具有日期和纪元格式值的字符串列转换为 postgresql/Tableau prep 中的日期列

具有固定增量的列的 R 回归