0

我有一个有效的预订查询。此查询检查预订时哪些项目可用。

[PROJECT]: projectid, datefrom, dateto, ...
[ITEM]: itemid, itemgroupid, ...
[ITEMGROUP]: itemgroupid, itemgroupname, ...
[RESERVELIST]: itemid, projectid, reservelistnr

SELECT *
FROM item i inner join itemgroup ig on i.itemgroupid = ig.itemgroupid
WHERE i.itemid NOT IN  (
                        SELECT r.itemid 
                        FROM reservelist r inner join project p on r.projectid = p.projectid
                        WHERE p.datefrom BETWEEN '$datefrom' AND '$dateto'
                        OR p.dateto BETWEEN '$datefrom' AND '$dateto'
                        OR '$datefrom' BETWEEN p.datefrom AND p.dateto
                        OR '$dateto' BETWEEN p.datefrom AND p.dateto
                        )
ORDER BY itemid 

$datefrom 和 $dateto 是预订时间的日期。
现在此查询运行良好,但如果有人在 08:00 - 21:00 之间进行预订,则下一次预订只能在 21:01 进行,而不能在 21:00 进行。所以我需要有一个小于和大于。

我玩了很多 < 和 >,但不知何故,它似​​乎不起作用。

我最好的猜测是这应该是一个很好的解决方案:

SELECT *
FROM item i inner join itemgroup ig on i.itemgroupid = ig.itemgroupid
WHERE i.itemid NOT IN  (
                        SELECT r.itemid 
                        FROM reservelist r inner join project p on r.projectid = p.projectid
                        WHERE p.datefrom > '$datefrom' AND p.datefrom < '$dateto'
                        OR p.dateto > '$datefrom' AND p.dateto < '$dateto'
                        OR '$datefrom' > p.datefrom AND '$datefrom' < p.dateto
                        OR '$dateto' > p.datefrom AND '$dateto' < p.dateto
                        )
ORDER BY itemid 

不幸的是,事实并非如此。


有人知道吗?

4

2 回答 2

1

您必须对条件进行分组。代替:

OR p.dateto > '$datefrom' AND p.dateto < '$dateto'

你想写:

OR (p.dateto > '$datefrom' AND p.dateto < '$dateto')

这样,您就具有与 BETWEEN 相同的功能(仅具有严格的“大于”条件)。你的其他条件也是如此。

最后,您的 WHERE 子句应如下所示:

WHERE (p.datefrom > '$datefrom' AND p.datefrom < '$dateto')
OR (p.dateto > '$datefrom' AND p.dateto < '$dateto')
OR ('$datefrom' > p.datefrom AND '$datefrom' < p.dateto)
OR ('$dateto' > p.datefrom AND '$dateto' < p.dateto)
于 2012-10-23T08:02:37.080 回答
0
WHERE i.itemid NOT IN  (
                        SELECT r.itemid 
                        FROM reservelist r inner join project p on r.projectid = p.projectid
                        WHERE p.datefrom BETWEEN '$datefrom' AND '$dateto'
                        OR p.dateto BETWEEN '$datefrom' AND '$dateto'
                        OR '$datefrom' BETWEEN p.datefrom AND p.dateto
                        OR '$dateto' BETWEEN p.datefrom AND p.dateto
                        )

作品。

于 2012-11-19T14:12:33.653 回答