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

标签 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

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

第二个表定义了订阅的天数。

还有一个预订表,用于保存个人预订,但在这里并不重要。

在进行预订时,我想首先检查是否有任何订阅与预订发生冲突,因此我需要查询上述两个表,提供预订的开始日期和 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/

相关文章:

mysql - 如何使用Mysql脚本将MySQL表中的数据解析到另一个表中

mysql - Go语言-不使用prepared statements向Mysql数据库插入数据

MySQL:根据第二列选择第一列的重复条目

mysql - 不同数据库中字符串的压缩

javascript - 通过函数/PHP 的数据表

mysql - 如何从shell/shell脚本获取sqlplus命令的输出状态?

连接两个表的前缀和非前缀字段的 SQL 查询

sql - 在此示例中,表 "Pictures"的主键是什么

java - 如何将 FlexyPool 与 HikariCPFactory 一起使用?

database - 管理 H2 数据库的前端工具