SQL 查询仅返回每 7 天增量而不是每天

问题描述 投票:0回答:1

我有一个小型调度应用程序,在数据库中我有两个小时增量的调度块。数据结构如下所示:

schedule_blocks (
    block_id SERIAL PRIMARY KEY,
    user_id INT NOT NULL,
    day_of_week VARCHAR(255) NOT NULL,
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,
    CONSTRAINT fk_user
        FOREIGN KEY (user_id)
        REFERENCES users(user_id)
);

目前我有一个 Schedule_block 行,其中一名用户每周至少有一个块。当我使用此查询时,我似乎只返回当前日期和 7 天增量,而不是一周中的任何其他日期。

这是我正在使用的查询。

WITH RECURSIVE weekdays AS (
  SELECT generate_series(0, 60) AS offset
),
dates AS (
  SELECT
    CURRENT_DATE + (w.offset || ' days')::interval AS date,
    EXTRACT(ISODOW FROM CURRENT_DATE + (w.offset || ' days')::interval) AS day_of_week
  FROM weekdays w
  WHERE EXTRACT(ISODOW FROM CURRENT_DATE + (w.offset || ' days')::interval) IN (1, 2, 3, 4, 5, 6, 7) -- Include only weekdays (Monday to Sunday)
),
schedule_blocks_with_dates AS (
  SELECT
    sb.*,
    d.date AS block_date
  FROM
    schedule_blocks sb
  JOIN dates d ON sb.day_of_week ILIKE to_char(d.date, 'Day')
  WHERE
    sb.is_available = TRUE
    AND d.date >= CURRENT_DATE
    AND d.date <= CURRENT_DATE + INTERVAL '2 months'
)
SELECT
  block_id,
  user_id,
  block_date AS date,
  start_time,
  end_time
FROM
  schedule_blocks_with_dates
ORDER BY
  date;

任何指导都会非常有帮助。

sql postgresql
1个回答
0
投票

根据您提供的上下文和

SQL
查询,问题似乎在于您尝试将
day_of_week
表中的
schedule_blocks
dates
CTE 生成的日期名称相匹配的方式
.

在您的查询中,

to_char(d.date, 'Day')
返回用空格填充的日期名称。所以,你必须修剪它。

此外,

day_of_week
表中的
schedule_blocks
字段是
VARCHAR
,您将其与日期中的星期几
ISO
进行比较,这不直接兼容。

我在下面附上了修改后的查询,

DB Fiddle
链接是这里

WITH RECURSIVE dates AS (
  SELECT CURRENT_DATE::date AS date
  UNION ALL
  SELECT (date + INTERVAL '1 day')::date
  FROM dates
  WHERE date < CURRENT_DATE + INTERVAL '59 days'
)
, schedule_blocks_with_dates AS (
  SELECT
    sb.block_id,
    sb.user_id,
    d.date AS block_date,
    sb.start_time,
    sb.end_time
  FROM
    schedule_blocks sb
  JOIN dates d ON TRIM(sb.day_of_week) = TRIM(to_char(d.date, 'Day'))
  WHERE
    sb.is_available = TRUE
    AND d.date >= CURRENT_DATE
    AND d.date <= CURRENT_DATE + INTERVAL '2 months'
)
SELECT
  block_id,
  user_id,
  block_date AS date,
  start_time,
  end_time
FROM
  schedule_blocks_with_dates
ORDER BY
  date, user_id, start_time;

结果将如下所示:

enter image description here

希望对您有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.