当前位置: 首页 > 知识库问答 >
问题:

Sql查询可用房间-INN或Delphi 2010小型酒店

屈升
2023-03-14

我在Delphi2010(TADOQuery)中使用ADO数据库。

目的是找到可用的房间,并显示一家小旅馆的房间价格。

房间(_R)

  coderoom as string
  coderoomtype as string

t_typeroom

  coderoomtype as string
  nameroomtype as string
  priceroomtype as number

t_trans

  datetrans as date
  codepoeple as string
  coderoom as string
  dateintrans as date -> date check in 
  dateouttrans as date -> date check out

目前,我使用下面的查询来显示房间价格。

SELECT 
    t_room.coderoom, t_room.coderoomtype, t_roomtype.coderoomtype, 
    t_roomtype.nameroomtype, t_roomtype.priceroomtype 
FROM 
    t_room 
INNER JOIN 
    t_roomtype ON t_room.coderoomtype = t_roomtype.coderoomtype 
ORDER BY 
    t_room.coderoom ASC;

并设法显示:(在Delphi2010的ADOQuery1和DBGrid1中)

coderoom | nameroomtype | priceroomtype
----------------------------------------
101      | VIP          | 20
102      | VIP          | 20
103      | Standart     | 10
104      | Standart     | 10
105      | Standart     | 10
106      | Standart     | 10

我想做的是如何显示t_trans内尚未预订或未签入的代码室?(具体日期)

也许像这样(使用非IN运算符):

SELECT 
    t_room.coderoom, t_room.coderoomtype, t_room.notesroom, 
    t_roomtype.coderoomtype, t_roomtype.nameroomtype, t_roomtype.priceroomtype 
FROM 
    t_room 
INNER JOIN 
    t_roomtype ON t_room.coderoomtype = t_roomtype.coderoomtype 
WHERE 
    t_room.coderoom NOT IN (SELECT * 
                            FROM t_trans 
                            WHERE [current book/checkin/out date not between dateintrans and dateoutrans] 
                            ORDER BY coderoom ASC)  
ORDER BY 
     t_room.coderoom ASC;

问题是如何找到在t_trans.datein和t_trans.dateout之间未预订的可用房间?

添加了一些文件,以便于理解我想在以下位置执行的操作:http://sidhiciang.com/myfiles/TRIAL可用房间.rar

当我使用下面的代码时,返回错误:$7701C41F-异常类EOleException,带有消息“您编写了一个子查询,它可以返回多个字段,而无需在主查询的From子句中使用EXISTS保留字。修改子查询的SELECT语句,只请求一个字段。”

代码是:

  AQRoomAvailable1.SQL.Text := 'SELECT t_room.coderoom, t_room.coderoomtype, t_room.notesroom, t_roomtype.coderoomtype, t_roomtype.nameroomtype, t_roomtype.priceroomtype ';
  AQRoomAvailable1.SQL.Text := AQRoomAvailable1.SQL.Text + 'FROM t_room INNER JOIN t_roomtype ON t_room.coderoomtype = t_roomtype.coderoomtype WHERE t_room.coderoom ';
  AQRoomAvailable1.SQL.Text := AQRoomAvailable1.SQL.Text + 'NOT IN (SELECT * FROM t_trans x WHERE x.coderoom = t_room.coderoom AND ( (x.dateintrans BETWEEN ' + DateToStr(dtpDateIn1.Date) + ' AND ' + DateToStr(dtpDateOut1.Date) + ' ) ';
  AQRoomAvailable1.SQL.Text := AQRoomAvailable1.SQL.Text + 'OR (x.dateouttrans BETWEEN ' + DateToStr(dtpDateIn1.Date) + ' AND ' + DateToStr(dtpDateOut1.Date) + ' ) ';
  AQRoomAvailable1.SQL.Text := AQRoomAvailable1.SQL.Text + 'OR (' + DateToStr(dtpDateIn1.Date) + ' BETWEEN x.dateintrans AND x.dateouttrans) ) )';

我已经阅读了下面的链接,但没有找到答案,因此更加困惑。。。。

检查一个房间的可用性SQL
mysql酒店房间可用性
列表可用的房间[酒店预订]
查询酒店预订中的可用房间
选择可用的房间
在房间可用性子查询上选择房间类型
客房预订查询
客房预订sql查询
SQL调度-选择给定日期范围的所有可用客房
SQL内部-加入3个表?
如何使用ID加入多个SQL表?
SQL查询不是在两个日期之间

共有2个答案

常自强
2023-03-14

两点意见:

    < li >通常使用整数作为主键(和外键),而不是字符串,正如您在这里所做的那样 < li >我不清楚t_trans.datetrans、t_trans.dateintrans和t_trans.dateouttrans之间的区别。

如果dateintrans是预订的开始,dateouttrans是结束,那么您需要的查询可能如下

SELECT t_room.coderoom
from t_room
where not exists (select 1 from t_trans
where t_trans.coderoom = t_room.coderoom
and t_trans.dateintrrans >= :p1
and t_trans.dateouttrans <= :p1)

:p1是您要检查的日期。

云丰
2023-03-14
  1. EE在SW和EW之间
  2. 已经被案例1和3抓住了
  3. SE在SW和EW之间
  4. SE和EE之间的SW

如果您希望在查询中使用参数(您应该这样做),这取决于您的数据库引擎是否能够在SQL中声明变量,以避免使用过多的参数。SQL示例如下所示(根据您记录结束和开始日期的方式,您可能需要在参数中添加/减去一个偏移量):

Declare @SW datetime
Declare @EW datetime
Select @SW=:SW
Select @EW=:EW
SELECT 
    t_room.coderoom, t_room.coderoomtype,  
    t_roomtype.coderoomtype, t_roomtype.nameroomtype, t_roomtype.priceroomtype 
FROM 
    t_room 
INNER JOIN 
    t_roomtype ON t_room.coderoomtype = t_roomtype.coderoomtype 
WHERE 
    t_room.coderoom NOT IN (SELECT x.coderoom 
                            FROM t_trans x
                            WHERE       
                                     (x.dateouttrans between @SW and @EW )
                                 OR  (x.dateintrans between @SW and @EW )
                                 OR  (@SW between x.dateintrans and x.dateouttrans)                                         
                            )  
ORDER BY 
     t_room.coderoom ASC;

编辑以从评论中回答

由于Access无法使用局部变量,因此必须使用5个参数,因此不应尝试创建没有参数的SQL。AQRoomAvailable1的SQL如下所示:

SELECT 
    t_room.coderoom, t_room.coderoomtype,
    t_roomtype.coderoomtype, t_roomtype.nameroomtype, t_roomtype.priceroomtype 
FROM 
    t_room 
INNER JOIN 
    t_roomtype ON t_room.coderoomtype = t_roomtype.coderoomtype 
WHERE 
    t_room.coderoom NOT IN (SELECT  x.coderoom
                            FROM t_trans x where

                                     (x.dateouttrans between :SW and :EW )
                                 OR  (x.dateintrans between :SW1 and :EW1 )
                                 OR  (:SW2  between x.dateintrans and x.dateouttrans)

                            )  
ORDER BY 
     t_room.coderoom ASC;

将您的Action actRoomCheckIn1更改为:

procedure TFMain.actRoomCheckIn1Execute(Sender: TObject);
begin
  if (dtpDateOut1.Date >= dtpDateIn1.Date) then
  begin
    AQRoomAvailable1.Close;
    AQRoomAvailable1.Parameters.ParamByName('SW').Value := dtpDateIn1.Date;
    AQRoomAvailable1.Parameters.ParamByName('EW').Value := dtpDateOut1.Date;
    AQRoomAvailable1.Parameters.ParamByName('SW1').Value := dtpDateIn1.Date;
    AQRoomAvailable1.Parameters.ParamByName('EW1').Value := dtpDateOut1.Date;
    AQRoomAvailable1.Parameters.ParamByName('SW2').Value := dtpDateIn1.Date;
    AQRoomAvailable1.Open;
  end
  else
  begin
    AQRoomAvailable1.Active := False;
  end;
end;
 类似资料:
  • 问题内容: 我有一个酒店预订系统的查询,当有特定房间时,我需要查找日期。(这是一家精品酒店,人们在其中预订特定的房间,因此在获得此代码之前,他们知道他们想要的确切房间。 我要查找的结果是一个房间的详细信息,我在查询中指定了一个房间-我是不查找多个房间的信息。 ) “可用性”表模式很简单,每一行是: 因此,例如,如果某个房间在1月1日至1月5日期间被占用,则将五行添加到可用性表中,每一天占据该房间。

  • 问题内容: 我在编写sql以从表中获取可用房间时遇到问题。我的表结构如下。 表:预订 桌子:房间 包含有关房间的详细信息,该表的主键是room_id,它具有1至10个房间,共10个房间。 我的问题是我想知道这些房间在2012年9月14日6:00 pm至21-09-2012 9:00 am之间可用,这意味着我应该只将room_id的结果作为1,3,5,7,8 ,9,10。 有人可以帮我编写SQL来从

  • 我正在将一个应用程序从普通的迁移到使用,我遇到的一个问题是,有几个查询具有用户可配置的order by语句,这意味着它们可以更改查看列表顺序的方式。 房间里似乎不允许动态order by语句,所以我必须针对每个order by语句进行单独的查询。 有没有人找到更好的方法来解决这个问题,这样我就可以有一个查询语句,其中唯一需要改变的是order by子句,而不是必须编写15个基本相同的额外查询语句?

  • 我是新来的和我试图我的得到一个从它。我试图这样做的它与这是id但问题是我不知道如何返回目标从。 这就是<代码>刀 这是Repository类

  • 我在我的应用程序中使用了Room DB,我想在查询中将列名作为变量,这样我就可以“在运行中”(在调用该方法时)对其进行操作。 示例代码(“name”假设是一个变量,表示一列): 我试过了,但它没有编译,错误是它需要获取一个列而不是一个字符串。 有没有办法把一个列作为变量?

  • 问题内容: 我有如下所示的ind Mysql可用性表: 每个房间的每个可用日期都有一行。可能存在间隙,例如,房间1可能有8月1,2,3,5,6,13,14,15的条目,隔天不可用。 我需要查询以找到room_ids列表,其中在日期范围内每天都有可用的空间。 换句话说,获取room_id列表,其中在开始日期和结束日期之间的每个日期都有每个房间的条目。 问题答案: 您想要这样的东西: 该子句将计算该时