如何正确使用Between语句

时间:2015-11-27 18:10:33

标签: sql sql-server

SQL SERVER:

Select tblActivity.RoomID, tblActivity.Time , tblRoom.RoomType
from tblActivity
Inner Join tblRoom
On tblRoom.ID = tblActivity.RoomID
Where tblActivity.Time Between 10 And 11
And  tblActivity.RoomID is NULL 
GROUP BY tblActivity.RoomID , tblRoom.RoomType

对不起,问题标题很模糊。真的不知道如何解释它。在这里 - 在这里我试图显示10到11之间没有使用的房间我怎么能显示它?

问题本身 - 列出早上10到11之间未使用的房间。 (5) 错误消息:消息8120,级别16,状态1,行1 专栏' tblActivity.Time'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

4 个答案:

答案 0 :(得分:1)

对于你的逻辑,你似乎想要not exists

Select r.*
from tblRoom r
where not exists (select 1
                  from tblActivity a
                  where r.ID = a.RoomID and
                        a.Time >= 10 and
                        a.Time <= 11
                 );

使用日期/时间时,通常最好使用显式比较而不是between,因为between的结果可能取决于列的类型。 (对于date / datetime比较尤其如此,但我只是养成习惯,而不是将其用于time。)

答案 1 :(得分:0)

Where tblActivity.Time Between 10 And 11与写作相同:

Where tblActivity.Time >= 10 And tblActivity.Time <= 11

请注意,SQL Server之间的区别为inclusive,这意味着结尾(11)包含在答案中......由于许多正当理由,这被认为是一种不好的做法。所以请注意,可能并非总是如此,在更改数据库引擎时可能会有惊喜。

为什么包容性范围是一种不好的做法?

当您必须对结果进行分区时,您更愿意使用算法来处理排除范围,例如X >= 0 and X < 10然后X >= 10 and X < 20,而不是包含X >= 0 and X <= 9然后X >= 10 and X <= 19

包容性范围意味着您必须处理数据中较小的粒度单位才能知道9与10相比是什么。使用简单的算法很容易,但是当您必须处理复杂的模式时可能会成为一个地狱。整数的最小单位是1,这很容易,但是Date或Float的最小单位是什么?

答案 2 :(得分:0)

由于between命令,该错误并非如此。该错误表示如果您使用的是group by,那么select列表中的每个字段都必须是您要归类的字段之一,或者必须是汇总字段(sumavgmax等等。

您可以通过将sum(tblActivity.Time)添加到group by这样的

来更正该错误
Select tblActivity.RoomID, tblActivity.Time , tblRoom.RoomType
from tblActivity
Inner Join tblRoom
On tblRoom.ID = tblActivity.RoomID
Where tblActivity.Time Between 10 And 11
And  tblActivity.RoomID is NULL 
GROUP BY tblActivity.RoomID , tblRoom.RoomType, tblActivity.Time

然而,即使有了这个修复,我也不认为这个查询能够为您提供您想要的东西。你真正想要的是tblRoom中所有行的列表,其中同一房间的tblActivity中没有行,时间在10到11之间。这将是一个与你所写的不同的查询。

答案 3 :(得分:-1)

使用SQL语句之间 查询是:

Select * from Table Name from Field Name 
between Value1 And Value2

日期&amp;价值应用可能