【问题标题】:Retrieve Records for month,datewise group by day in postgres在postgres中按天检索记录,按日期分组
【发布时间】:2019-09-09 19:13:07
【问题描述】:

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

欢迎任何建议和线索。

【问题讨论】:

  • 我不清楚你在期待什么。你展示了两种不同的结果。您是否只想计算每天和用户的记录(这里的主要问题是零日)?还是您只是想获得原始表格的字符串连接版本?
  • 我已经修改了我的问题,只是想计算每天和用户的记录,以及零时隙日@S-Man
  • 好的,有日期范围吗?否则我猜你会得到很多零日......因为你添加了 JSON 部分?您是否也想将时隙作为 JSON 数组获取? JSON 对象中的计数在哪里?
  • 你还在使用 Postgres 9.1 吗?那是no longer supported,您应该尽快计划升级。
  • 一个月我需要获取日期值。我已更新我的 JSON.JSON 将采用 JAVA 而非 SQL 构建。 @S-Man

标签: postgresql


【解决方案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

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 2021-09-02
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多