我有time_slot表,其中有诸如date,start_time,end_time,user之类的列。
我想检索记录,比如说如果我将月份和年份与用户一起给出,那么一个特定的用户日在一个月内可用的时段是多少。假设用户一天可以有3个插槽,一天可以有0个插槽。
我正在使用Postgres,并且我的日期列是日期,时间列是时间。我正在尝试在Java Web应用程序中执行此操作,并且将使用jquery datepicker选择日期。我以月,年和用户身份发送的位置。
表的样本数据。
Date start-time end-time user
2019-09-01 12:21:34 13:21:34 user1
2019-09-01 14:21:34 15:21:34 user1
2019-09-01 17:21:34 17:21:34 user1
2019-09-03 12:21:34 13:21:34 user1
2019-09-03 12:21:34 13:21:34 user1
我想创建一个查询,该查询提供给用户简明的“开始时间”和“结束时间”列的时隙,并按日期将结果分组一个月,如下所示:
Date count_of_slots
2019-09-01 3
2019-09-02 0
2019-09-03 2
我尝试了以下查询。
select distinct kt.start_time,kt.end_time,DATE(kt.slot_date),count(kt.slot_date)
from time_slot as kt
WHERE date_trunc('month',to_timestamp(kt.start_time, 'yy-mm-dd HH24:MI:SS.MS') + interval '1 day')
= date_trunc('month',to_timestamp(:startdate, 'yy-mm-dd HH24:MI:SS.MS') + interval '1 day' )
group by DATE(kt.slot_date) order by cb.start_time.
按上述格式获得预期结果后,我需要遍历日期以获取当天的时间段,并按以下方式存储在json中。
{
"Date" : "2019-09-01",
"count" : "3",
"time-slot" : [
"12:21:34 - 13:21:34","14:21:34 - 15:21:34","17:21:34 - 17:21:34"]
}
欢迎任何建议和线索。
答案 0 :(得分:1)
免责声明:您应该真正升级Postgres版本!
您需要针对数据集加入日期系列。可以使用generate_series()
函数来完成。
SELECT
gs::date,
COUNT(the_date)
FROM
time_slot ts
RIGHT JOIN
generate_series('2019-09-01', '2019-09-05', interval '1 day') gs ON ts.the_date = gs
GROUP BY gs
如果您还想获得time_slots
,只需添加:
ARRAY_AGG(start_time || ' - ' || end_time) AS time_slot