我有一个小型调度应用程序,在数据库中我有两个小时增量的调度块。数据结构如下所示:
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
查询,问题似乎在于您尝试将 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;
结果将如下所示:
希望对您有帮助!