使用DateTime函数检查预订日期的订阅

时间:2014-04-26 14:13:24

标签: mysql sql database

我有以下表格

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

第一个表定义订阅何时开始以及订阅属于哪个空间。

第二个表定义了订阅的日期。

还有一个预订表可以保存个人预订,但这里不重要。

在预订时,我想首先查看是否有任何订阅会与预订发生冲突,所以我需要查询上面的2个表格,提供预订的起始日期和空格,并检查是否存在任何会阻止预订发生的订阅,并相应地返回true或false。我可以使用当前的表定义吗?

1 个答案:

答案 0 :(得分:1)

这将显示给定日期和特定日期和空间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)
)

我用过: &#39; 2014-04-28&#39;为了约会, 1表示空格id(将这些变为sub c中的变量)

它将显示该空间的所有订阅,这些订阅已在提示日期开始,并且在提示日期的星期几中具有1值。

有一个问题,您没有记录结束日期。因此,可能已经结束的订阅仍然会显示为冲突,即使它们实际上并不存在冲突。我会在您的订阅表中添加一个结束日期,然后在上述查询中包含一个额外的标准行,以避免因为出现冲突而结束的订阅。

SQL小提琴测试在这里:http://sqlfiddle.com/#!2/62fefd/9/0

请注意,2014年4月28日是星期一。我使用了spaceid 1(参见sub c)。订阅#3冲突,因为它也在spaceid 1,MON列中的值为1(28日是星期一)。

尝试更改子c中的值以进行测试。

(请注意,如果没有冲突,您只需返回1行空值)