0

有効な予約クエリがあります。このクエリは、予約時に利用可能なアイテムを確認します。

[プロジェクト]: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 に答える