Я пытаюсь написать SQL-запрос для моей базы данных, который будет извлекать все конкретные события пользователей. Если они отмечены как повторяющиеся, я хочу, чтобы они показывались еженедельно в течение 52 недель после даты начала. Есть ли лучший способ сделать это? Мой текущий код кажется довольно неуклюжим.Ошибка с одним SQL-запросом
Мои таблицы построены следующим образом:
event (
event_id INT NOT NULL AUTO_INCREMENT, (PK)
title VARCHAR(80) NOT NULL,
description VARCHAR(200),
event_start DATETIME,
event_end DATETIME,
group_id INT NOT NULL,
recurring BOOLEAN
);
Users{
UserID (PK)
Username
}
Groups{
GroupID (PK)
GroupName
}
Membership{
UserID (FK)
GroupID (FK)
}
Вот запрос у меня есть на данный момент, он не будет работать в данный момент, может кто-нибудь, пожалуйста, помогите мне с этим?
var result = db.Query(
@"SELECT e.event_id, e.title, e.description, e.event_start, e.event_end, e.group_id, e.recurring
FROM event e
JOIN Membership m ON m.GroupID = e.group_id
WHERE e.recurring
AND m.UserID = ?
AND e.event_start >= ?
AND e.event_end <= ?
UNION ALL
SELECT e.event_id, e.title, e.description, DATEADD(week, w.weeks, e.event_start),
DATEADD(week, w.weeks, e.event_end), e.group_id, e.recurring
FROM event e
JOIN Membership m ON m.GroupID = e.group_id,
(SELECT row_number() OVER (ORDER BY Object_ID) AS weeks
FROM SYS.OBJECTS) AS w
WHERE NOT e.recurring
AND m.user_id = ?
AND e.event_start >= ?
AND e.event_end <= ?", username, start, end, username, start, end
);
Может кто-нибудь помочь мне адаптироваться мой код так, что он выбирает все события, которые не повторяющееся и выбирает повторяющиеся события, в то же время в течение 52 недель?
Как примечание стороны, помните, что год не имеет 52 недель. –
52.177457 недель! Легче округлить, хотя, нет ?! :) –
Я видел системы, которые получают еще пару уродливых хаков в слепой панике каждый раз, когда в текущем году нет 52 недель. –