从纳秒时间戳按天分组

Group by day from nanosecond timestamp

我有一个 table 列 transaction_timestamp 将时间戳存储为具有 纳秒 分辨率的纪元。

如何按天对 and/or 进行分组?我想我必须先将纳秒时间戳转换为毫秒。我该怎么做?

我试过了:

SELECT DATE_TRUNC('day', CAST((transaction_timestamp /pow(10,6))as bigint)), COUNT(*)
FROM transaction
GROUP BY DATE_TRUNC('day', transaction_timestamp)

这是行不通的:

error: function date_trunc(unknown, bigint) does not exist

我也试过这个:

SELECT DATE_TRUNC('day', to_timestamp(transaction_timestamp / 1000000000.0)),
 COUNT(*)
FROM transaction
GROUP BY DATE_TRUNC('day', transaction_timestamp)

按照此处的说明进行基本转换:

GROUP BY 中重复相同的表达式,或使用简单的位置引用,例如:

SELECT date_trunc('day', to_timestamp(transaction_timestamp / 1000000000.0))
     , count(*)
FROM   transaction
GROUP  BY 1;

请注意,to_timestamp() 假定给定纪元的 UTC 时区会产生 timestamp with time zonetimestamptz)。下面的 date_trunc() 然后使用当前会话的 timezone 设置来确定截断“天”的位置。您可能想要明确定义某个时区...
基础知识:

  • Ignoring time zones altogether in Rails and PostgreSQL

通常,最好先使用适当的 timestamptz。不幸的是,Postgres 时间戳只提供微秒分辨率。由于您需要纳秒,因此您的方法似乎是合理的。