检索月份中的记录,按日期按日期分组

时间:2019-09-09 07:07:43

标签: postgresql

我有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"]
}

欢迎任何建议和线索。

1 个答案:

答案 0 :(得分:1)

免责声明:您应该真正升级Postgres版本!


demo:db<>fiddle

您需要针对数据集加入日期系列。可以使用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
相关问题