我想获取过去 28 天的数据,并且只包括完整的天数。所以我的意思是,当我今天上午10:00查看数据时,它只包括昨天(完成的一天)和前28天的数据。
我正在用这样的数字创建一个实时仪表板。所以我不希望数字在一天结束之前发生变化。
此外,我愿意了解 CURRENT_DATE
和 CURRENT_TIMESTAMP
之间的区别
例如,在我的代码中,如果我使用CURRENT_TIMESTAMP
,我会得到从今天上午 10:00 到 28 天前上午 10:00 的数据吗?如果没有,我如何根据每次运行代码时数字实时变化的方式获取数据(数据库中数据变化的平均时间为 10 分钟)。
我的简化代码:
select count(id) from customers
where created_at > CURRENT_DATE - interval '28 days'
也许我使用了错误的代码,你能给我一些关于如何以两种格式获取日期的建议吗:
- 只包括完整的天数(不包括今天,直到那天 完成)
- 包括时间,从今天早上到前 28 天 早上的时间。
最佳答案
假设 created_at
是 timestamptz
类型。
- include only complete days(does not include today, until the day is finished)
从 now()
开始并使用 date_trunc()
:
SELECT count(*)
FROM customers
WHERE created_at < date_trunc('day', now())
AND created_at >= date_trunc('day', now() - interval '28 days');
或者使用 CURRENT_DATE
...
WHERE created_at < CURRENT_DATE
AND created_at >= CURRENT_DATE - 28;
两者的结果取决于当前的 timezone
设置。 “日期”在功能上取决于您当前的时区。类型timestamp with time zone
(timestamptz
) 没有。但是表达式 date_trunc('day', now())
引入了与“day”相同的依赖项,该依赖项由您当前的时区定义。因此,您需要准确定义您指的是哪些“天”。基础知识:
您可以从 date
中减去 integer
值以减去天数:
now()
是 CURRENT_TIMESTAMP
的缩写。见:
count(*)
等同于 count(id)
而 id
被定义为 NOT NULL
,但是快一点。
- include hours, from today morning until 28 days back same time in the morning.
简单地:
WHERE created_at > now() - interval '28 days'
不依赖于当前时区。
关于sql - CURRENT_TIMESTAMP 和 CURRENT_DATE 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57469642/