我有下表
Subscription
id startdate spaceid vehicleid buyerid
3 2014-04-23 1 1 4
4 2014-05-20 1 2 5
SubscribedDays
id mon tue wed thur fri sat sun subscriptionid
1 1 0 0 0 1 0 0 3
2 0 0 1 0 0 0 0 4
第一个表定义订阅何时开始以及订阅属于哪个空间。
第二个表定义了订阅的天数。
还有一个预订表,用于保存个人预订,但在这里并不重要。
在进行预订时,我想首先检查是否有任何订阅与预订发生冲突,因此我需要查询上述两个表,提供预订的开始日期和 spaceid,并检查是否存在任何会阻止预订发生的订阅,并相应地返回 true 或 false。我可以使用当前的表定义来执行此操作吗?
最佳答案
这将显示给定日期以及特定日期和空间 ID 的任何/所有冲突:
SELECT
s.startdate,
d.*
FROM
subscription s
JOIN subscribeddays d ON s.id = d.subscriptionid
RIGHT JOIN (
SELECT
'2014-04-28' AS c_dt,
dayofweek('2014-04-28') AS c_dt_wk,
1 AS c_space
FROM
DUAL
) c ON c.c_space = s.spaceid
AND s.startdate <= c.c_dt
AND (
(c.c_dt_wk = 1 AND d.sun = 1)
OR (c.c_dt_wk = 2 AND d.mon = 1)
OR (c.c_dt_wk = 3 AND d.tue = 1)
OR (c.c_dt_wk = 4 AND d.wed = 1)
OR (c.c_dt_wk = 5 AND d.thur = 1)
OR (c.c_dt_wk = 6 AND d.fri = 1)
OR (c.c_dt_wk = 7 AND d.sat = 1)
)
我用过: 日期为“2014-04-28”, 1 代表空间 id(将这些更改为子 c 中的变量)
它将显示该空间中已在提示日期之前开始的所有订阅,并且提示日期的星期几的值为 1。
有一个问题,您没有记录结束日期。因此,可能已结束的订阅仍将显示为冲突,即使它们实际上并不存在冲突。我会在您的订阅表中添加一个结束日期,然后在上述查询中添加一行额外的条件,以避免已结束的订阅显示为冲突。
SQL fiddle 测试在这里:http://sqlfiddle.com/#!2/62fefd/9/0
请注意,2014 年 4 月 28 日是星期一。我使用了 spaceid 1(参见 sub c)。这与订阅 #3 冲突,因为它也在 spaceid 1 处,并且 MON 列中的值为 1(28 号是星期一)。
尝试更改 sub c 中的值来测试它。
(请注意,如果没有冲突,您只会返回 1 行空值)
关于mysql - 使用 DateTime 函数检查预订日期的订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23312102/