我需要使用DATEDIFF进行几次查询

时间:2013-11-12 18:49:23

标签: sql ms-access datediff

1.)列出迄今为止收到的每家酒店的收入,即DepartureDate<现在()。必须在SQL语句中完成计算。使用DateDiff函数确定每个预留的长度(即天数),并将此值乘以房价(而不是折扣率)。在输出中包含酒店编号。

到目前为止,我已经尝试了这个但是它不对,并且给了我DateDiff语句的聚合函数错误

SELECT ROOM.HotelNo, DateDiff("d", [ArrivalDate], [DepartureDate]) *  ROOM_TYPE.RoomRate AS TotalRevenue
FROM RESERVATION, ROOM_TYPE, ROOM
WHERE ROOM.RoomType = ROOM_TYPE.RoomType
AND RESERVATION.RoomNo = ROOM.RoomNo
AND DepartureDate > Now()
GROUP BY ROOM.HotelNo;

以下是您可以看到表

的链接

RelationShip Table < - LINK

请帮我解决这个问题

2 个答案:

答案 0 :(得分:1)

使用Sum()表达式的DateDiff()来避免“不包含指定的表达式...作为聚合函数”投诉的一部分。

SELECT
    ROOM.HotelNo,
    Sum(
        DateDiff(
                "d",
                [ArrivalDate],
                [DepartureDate]
            ) * ROOM_TYPE.RoomRate
        ) AS TotalRevenue

WHERE条款包含DepartureDate > Now(),我怀疑该结果会将结果过滤给那些尚未离开的人。我想你想要<而不是>

考虑使用INNER JOIN而不是使用WHERE子句来指定表中的行如何匹配。如果您可以从Access查询设计器的“设计视图”构建此查询,则设置连接将很容易。并且当连接超过2个表时,查询设计者知道有关所需括号的规则...因此将产生使数据库引擎保持满意的SQL。

答案 1 :(得分:0)

正如engineersmnky指出的那样,您的DATEDIFF是错误的。它应该是2个参数,然后离开然后到达日期:

SELECT 
    ROOM.HotelNo, 
    DATEDIFF(RESERVATION.DepartureDate, RESERVATION.ArrivalDate) *  ROOM_TYPE.RoomRate AS TotalRevenue
FROM RESERVATION
JOIN ROOM ON 
    RESERVATION.RoomNo = ROOM.RoomNo
JOIN ROOM_TYPE ON
    ROOM.RoomType = ROOM_TYPE.RoomType
WHERE RESERVATION.DepartureDate > NOW()
GROUP BY ROOM.HotelNo;

我不确定为什么你在DepartureDate和ArrivalDate周围都有括号,因为它们只是RESERVATION表上的列是正确的?