1

テーブル名:MRM_BOOKING_DETAILS
サンプルデータ:

Booking_id USER_ID ROOM_ID CHECKIN             CHECKOUT
1          hary    1       2012-04-16 09:00:00 2012-04-16 09:30:00
2          jenny   2       2012-04-17 13:00:00 2012-04-17 13:30:00
3          steve   1       2012-04-16 15:00:00 2012-04-16 15:30:00

等々...

Booking_id主キーです。PKとして持つRoom_Id外部キーです。Room_Details_TableRoom_Id

私の目標は、特定の日、ユーザーが入力した特定の時間に利用可能なレコードのリストを取得することです。これを行うために、私はこのクエリを思いつきました:

SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (SELECT distinct roomid 
                FROM MRM_BOOKING_DETAILS 
                WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')
                  and (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00'))
  AND CAPACITY > 15 AND PROJECTIONSTATUS = 'NO';

CapacityProjectionStatusは部屋の詳細テーブルの列です。現時点ではその部分は無視してください。

CHECKINおよびCHECKOUTは、検索画面でユーザーが提供する値です。

しかし、残念ながらサブクエリが正しくないため、目的の結果が得られません。

SELECT distinct roomid 
FROM MRM_BOOKING_DETAILS 
WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') and
      (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00');

これが、サブクエリが正しくないと言う理由です。ユーザーが提供する値は次のとおりです。

CHECKIN : 2012-04-16 09:00:00 and CHECKOUT: 2012-04-16 09:30:00

上記のデータを表にすると、ROOM_ID1と2の両方が返されます。最初の行では失敗しますが、2番目と3番目の行では成功します。その結果、1と2の両方が返されますが、これは正しくありません。正しい結果は2つだけです。

正しいクエリを取得するのを手伝ってください。

4

2 に答える 2

1

日付が文字列の場合、Sqliteは日付の比較をサポートしていません。これを機能させるには、すべてのデータベース側の日付を数値に変換する必要があります。

于 2012-04-17T18:18:24.577 に答える
1

ロジックを「x時間以外に予約された部屋」から「x時間に予約されていない部屋」に変更します。

また、おそらくこのDATETIME関数を使用する必要があります。

アップデート

すべての交差点のチェックを追加しましたがBETWEEN、8:30から9:00および9:00から9:30に部屋を予約できるように、包括的を使用していません。

SELECT ROOMNO, BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID NOT IN (
    SELECT DISTINCT ROOM_ID as ROOMID
    FROM MRM_BOOKING_DETAILS 
    WHERE (DATETIME(CHECKIN) > DATETIME('2012-04-16 08:30:00') AND DATETIME(CHECKIN) < DATETIME('2012-04-16 09:31:00'))
        OR (DATETIME(CHECKOUT) > DATETIME('2012-04-16 08:30:00') AND DATETIME(CHECKOUT) < DATETIME('2012-04-16 09:31:00'))
        OR (DATETIME('2012-04-16 08:30:00') > DATETIME(CHECKIN) AND DATETIME('2012-04-16 08:30:00') < DATETIME(CHECKOUT))
        OR (DATETIME('2012-04-16 09:31:00') > DATETIME(CHECKIN) AND DATETIME('2012-04-16 09:31:00') < DATETIME(CHECKOUT))
)
    AND CAPACITY > 15
    AND PROJECTIONSTATUS = 'NO';
于 2012-04-17T21:38:54.357 に答える