当前位置: 首页 > 图文教程 > 数据库 > MSSQL > MSSQL SERVER中的BETWEEN AND的使用

MSSQL
精细讲述SQL Server数据库备份多种方法
让SQL Server也能使用2G以上内存
SQL Server数据库崩溃恢复之法
创建区分大小写的SQL Server 2000实例
SQL Server中易混淆的数据类型
如何优化SQL Server数据库查询
使用Robot连接SQL的例子
如何让你的SQL运行得更快
对Sql Server中的表添加级联更新和级联删除
常用SQL语句书写技巧
SQL Server与Oracle实施成本上的差异
解析SQL Server的数据类型 BLOB
SQL Server数据库和XML标识语言的集成
SQLServer 数据库还原和孤立用户的解决办法
SQL Server 2000/2005 分页SQL
Sql Server锁表
SQLServer2005实现远程数据库备份
SQL精妙语句
SQL Server 2008的逻辑查询处理步骤
如何让你的SQL运行得更快

MSSQL SERVER中的BETWEEN AND的使用


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 62 ::
收藏到网摘: n/a

sql的between與查詢日期範圍的问题,今天将access转sql时发现的问题。

資料 Customer

Id Name RegisterDate
1 澎澎 2007/1/5 00:00:00
2 丁丁 2007/1/6 00:00:00
3 亞亞 2007/1/7 00:00:00

aspx頁面查詢條件:

最小日期: [2007-01-06] 最大日期: [2007-01-06]

使用的 sql:

SELECT ID, Name, RegisterDate
FROM Customer
WHERE (RegisterDate BETWEEN '2007-01-06' AND '2007-01-06')

結果是傳回1筆:丁丁, 符合我的預期

但是 如果丁丁的RegisterDate 的時間 不是00:00:00呢?

如果資料是這樣

Id Name RegisterDate
1 澎澎 2007/1/5 00:00:00
2 丁丁 2007/1/6 04:37:00
3 亞亞 2007/1/7 00:00:00

一樣的sql

SELECT ID, Name, RegisterDate
FROM Customer
WHERE (RegisterDate BETWEEN '2007-01-06' AND '2007-01-06')

傳回來的是0筆

嗯,因為我沒有給予正確的時間範圍嘛,我的查詢條件應該是2007/1/6 號整天時間範圍。

所以我通常程式在查詢前,都會先幫日期加1天

RegisterMaxDate = RegisterMaxDate.AddDays(1);

但是,這樣就對了嗎??

這樣的程式產生的sql是

SELECT ID, Name, RegisterDate
FROM Customer
WHERE (RegisterDate BETWEEN '2007-01-06' AND '2007-01-07')

反而傳回2筆,把亞亞也傳回來了

因為 Sql 的 between min And max 是 value >=min && value <= max 的意思

所以我應該更精確的

RegisterMaxDate = RegisterMaxDate.AddDays(1).AddSeconds(-1);

那樣產生的sql 才會是

SELECT ID, Name, RegisterDate
FROM Customer
WHERE (RegisterDate BETWEEN '2007-01-06' AND '2007/1/6 23:59:59')

傳回1筆,也就是丁丁,我要的資料。


4.3.5 限定数据范围——BETWEEN

在WHERE子句中,使用BETWEEN关键字可以更方便地限制查询数据的范围。当然,还可以使用NOT BETWEEN关键字查询限定数据范围之外的记录。


语法格式可表示如下:

 表达式[NOT] BETWEEN 表达式1 AND 表达式2 

比如,选择范围在10~100之间的数,采用BETWEEN运算符可以表示为BETWEEN 10 AND 100。

★ 注意 ★

使用BETWEEN限制查询数据范围时同时包括了边界值,而使用NOT BETWEEN进行查询时没有包括边界值。

实例20 使用BETWEEN限定数据范围查询

本实例实现在BookInfo表中,查询图书价格在35~60之间的所有图书记录。代码如下:

 USE Library
SELECT *
FROM BookInfo
WHERE price BETWEEN 35 AND 60
运行该代码,得到的查询结果如图4.21所示。
图4.21 查询BookInfo表中图书价格在35~60之间的记录


从结果可见,使用BETWEEN关键字查询包含了边界值。

实际上,使用BETWEEN表达式进行查询的效果完全可以用含有“>=”和“<=”的逻辑表达式来代替,使用NOT BETWEEN进行查询的效果完全可以用含有“>”和“<”的逻辑表达式来代替。

对于实例20,若采用含有“>=”和“<=”的逻辑表达式来代替BETWEEN表达式,代码如下:

USE Library
SELECT *
FROM BookInfo
WHERE price >=35
AND price <=60

执行该代码,会得到同样的查询结果。

使用BETWEEN运算符也可以实现时间的比较,下面就给出一个具体的应用实例。

实例21 使用BETWEEN运算符限定时间范围查询

本实例实现在BookInfo表中,查询出版日期在2004/5/1和2006/1/1之间的所有图书记录。代码如下:

USE Library
SELECT *
FROM BookInfo
WHERE pubdate BETWEEN '2004/5/1' AND '2006/1/1'
运行该代码,得到的查询结果如图4.22所示。
图4.22 查询BookInfo表中出版日期在2004/5/1和2006/1/1之间的记录