我在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查询不是在两个日期之间
两点意见:
如果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是您要检查的日期。
如果您希望在查询中使用参数(您应该这样做),这取决于您的数据库引擎是否能够在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列表,其中在开始日期和结束日期之间的每个日期都有每个房间的条目。 问题答案: 您想要这样的东西: 该子句将计算该时