如何对具有纪元值的列进行 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()
仅适用于 timestamp
或 date
值,不适用于 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 中的时间部分的主要内容,如果未能解决你的问题,请参考以下文章
在执行 Select 查询时,如何忽略 Postgresql 中某列具有特定值的数据行?
Spark SQL中Dataframe join操作含null值的列