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

MSSQL
如何让新安装的MySQL数据库变得更安全
考虑SQL Server安全时所应注意的几个方面
快速解决SQL server 2005孤立用户问题
比较一下看看自己掌握了多少SQL快捷键
怎样在SQL Server 2005中用证书加密数据
讲解使用SQL Server升级顾问的详细步骤
讲解设计应用程序时避免阻塞的八个准则
配置SQL Server文件组对应不同的RAID系统
讲解数据库管理系统必须提供的基本服务
讲解SQL Server2005数据项的分拆与合并
SQL Server数据库动态交叉表的参考示例
SQL SERVER 2005中的同步复制技术
SQL Server查询速度慢的原因及优化方法
减少SQL Server死锁的方法
sql server 视图作用
扩展数据库系统选项实现更高的可扩展性
SQL Server开发过程中的的常见问题总结
对跨多个表格的数据组合时需要用到的SQL
SQL Server 2005 FOR XML嵌套查询使用详解
另类解读SQL Server中的DateTime数据类型

MSSQL SERVER中的BETWEEN AND的使用


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 158 ::
收藏到网摘: 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之间的记录