从时间7:00:00 am
到第二天6:59:59 am
,我需要使用PostgreSQL获取记录计数,然后从7:00am to 6:59:59 am
重新设置计数。
我将后端用作Java(春季启动)的地方。
我表中的列是
我如何给明智的换班条件?
答案 0 :(得分:2)
您需要根据当前时间选择一个切片(我假设这是某种计数器,它将在某些应用程序中自动刷新)。
一种方法是使用时间范围:
SELECT COUNT(*)
FROM mytable
WHERE createdon <@ (
SELECT CASE
WHEN current_time < '07:00'::time THEN
tsrange(CURRENT_DATE - '1d'::interval + '07:00'::time, CURRENT_DATE + '07:00'::time, '[)')
ELSE
tsrange(CURRENT_DATE + '07:00'::time, CURRENT_DATE + '1d'::interval + '07:00'::time, '[)')
END
)
;
答案 1 :(得分:0)
您可以使用聚合-减去7个小时:
select (createdon - interval '7 hour')::date as dy, count(*)
from t
group by dy
order by dy;
答案 2 :(得分:0)
据我所知,在每个24小时内从07:00:00开始的值中,您需要有一个单独的组。
SELECT
(
date_trunc('day', (createdon - '7h'::interval))
+ '7h'::interval
) AS date_bucket,
count(id) AS count
FROM lorem
GROUP BY date_bucket
ORDER BY date_bucket
这使用了date and time functions和GROUP BY clause:
将时间戳记值后退7小时((createdon - '7h'::interval)
),因此可以通过更改日期(在00:00:00)来区分。然后,
将值截断为日期(date_trunc('day', …)
),以便将存储桶中的所有值展平为单个值(午夜的日期)。然后,
再次将7小时添加到值(… + '7h'::interval
)中,以便它代表存储桶的开始时间。然后,
按该值(GROUP BY date_bucket
)分组。
包含模式和数据的更完整示例:
DROP TABLE IF EXISTS lorem;
CREATE TABLE lorem (
id serial PRIMARY KEY,
createdon timestamp not null
);
INSERT INTO lorem (createdon) (
SELECT
generate_series(
CURRENT_TIMESTAMP - '36h'::interval,
CURRENT_TIMESTAMP + '36h'::interval,
'45m'::interval)
);
现在查询:
SELECT
(
date_trunc('day', (createdon - '7h'::interval))
+ '7h'::interval
) AS date_bucket,
count(id) AS count
FROM lorem
GROUP BY date_bucket
ORDER BY date_bucket
;
产生以下结果:
date_bucket | count
---------------------+-------
2019-03-06 07:00:00 | 17
2019-03-07 07:00:00 | 32
2019-03-08 07:00:00 | 32
2019-03-09 07:00:00 | 16
(4 rows)