按天分组时间戳,而不是按时间分组。

90

我有一个表格用于存储我运行的网络服务的用户访问/查看日志。它将时间作为时间戳进行跟踪,但我发现当进行聚合报告时,我只关心日期,而不是时间。

我当前正在运行以下查询:

SELECT
    user_logs.timestamp
FROM
    user_logs
WHERE
    user_logs.timestamp >= %(timestamp_1)s
    AND user_logs.timestamp <= %(timestamp_2)s
ORDER BY
    user_logs.timestamp

通常会有其他的where条件,但它们对这个问题不重要。我正在使用Postgres,但我认为无论使用什么功能,它都可以在其他语言中工作。

我将结果拉入Python脚本,计算每天的观看次数,但如果数据库可以为我分组和计算,则更有意义。

如何简化它,使其按日分组并忽略时间?

1个回答

183
SELECT date_trunc('day', user_logs.timestamp) "day", count(*) views
FROM user_logs
WHERE user_logs.timestamp >= %(timestamp_1)s
    AND user_logs.timestamp <= %(timestamp_2)s
group by 1
ORDER BY 1

90
PostgreSQL 快捷方式:使用 user_logs.timestamp::date 代替 date_trunc('day', user_logs.timestamp)。该快捷方式功能与前者相同,可以将 user_logs.timestamp 字段转换为日期,但更为简洁。 - Ihor Romanchenko
38
请注意,将数据类型转换为::date会丢失时区信息,而date_trunc则不会。这在您想要比较两年中的同一天并且该天从一个时区更改到另一个时区时可能很重要。 - Clodoaldo Neto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接