近段时间在程序中写到有关搜索的功能。其中有使用到MS SQLServer的关键词BETWEEN,它是搜索数值范围(包括本身)之间的数据。

在使用它时,一些情况还需要注意的。如果时间的数据。

搜索时间数据,要看数据库存储时间精度,存储只有日期或带有时间日期就需要注意了。不然搜索出来的数据与预期有有些出入。

如:

根据上面的数据,如果搜索日期17号至18的数据,你可以写的条件如下:
... WHERE [Date] BETWEEN '2016-10-17' AND '2016-10-18'。其实它可以等于下面的写法:
... WHERE [Date] >= '2016-10-17' AND [Date] <= '2016-10-18'。
因为BETWEEN是获取数值范围(包括本身)之间的数据。但如果NOT BETWEEN呢,则不包括边界的数据。
搜索到的结果,所有17和18号的数据均会搜索出来。

Ok,接下来我们看另外一些数据:

搜索上面这个资料时,如果再使用上面的条件:
... WHERE [Date] BETWEEN '2016-10-17' AND '2016-10-18'。
你会发现,只能搜索到17号的数据,没有18号的数据,除非刚好有一笔的时间为:2016-10-18 00:00:00:000,也只能搜索到18号此笔。检查原因,你需要参考它相等的语法:
... WHERE [Date] >= '2016-10-17' AND [Date] <= '2016-10-18',它还等于:
... WHERE [Date] >= '2016-10-17 00:00:00:000' AND [Date] <= '2016-10-18 00:00:00:000'
看了最后一个等价表过式,你就会明白它为何只搜索到17的所有数据了。
问题已经出来了,那我们怎样去解决它呢?如果你搜索的时间数据时,根据它的精度为处理。只有日期,没有时间的,大可以放心BETWEEN来搜索其范围。
当时间数据有日期和时间时,建议使用大于等于(>=) 和小于(<)结合的条件以及结束日期还要加一天。
如下:
WHERE [Date] >= '2016-10-17' AND [Date] < DATEADD(DAY,1,'2016-10-18')

其实,Insus.NET以前也有写过相关BETWEEN相关的博文,参考:
MS SQL Server带有时间的记录怎样查询http://www.cnblogs.com/insus/p/3800587.html
在这篇中的BETWEEN使用中,也有在结束时间时行加一天减2秒。其它这也是不正确的,在此作纠正处理方法。

还有一篇:
如何在Web网站实现搜索功能http://www.cnblogs.com/insus/archive/2011/03/30/1999795.html
这篇在条件拼接时,只是定义到59秒,所以,当数据含有微秒时,就搜索不到了。

不管怎样,减秒是不正确的处理方法。还是时间的精度问题。

在MSDN中查阅的看看时间部分(datepart)在SQL Server版本之间区别:

总结:
搜索时间数据,需要放之四海皆准的法则,还是少用BETWEEN,在结束日期加一天,并使用小于(<)逻辑条件。

MS SQLServer的关键词BETWEEN的一些注意事项的更多相关文章

  1. MS SQLServer 批量附加数据库 分类: SQL Server 数据库 2015-07-13 11:12 30人阅读 评论(0) 收藏

    ************************************************************ * 标题:MS SQLServer 批量附加数据库 * 说明:请根据下面的注释 ...

  2. MS SQLSERVER中如何快速获取表的记录总数

    在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等.我们通常的做法是:select count(*) as c from tableA .然而对 ...

  3. EF Core CodeFirst实践 ( 使用MS SqlServer)

    这里使用 MS SQLSERVER ,网上大多使用 SQLite 先来一个CodeFirst 新建项目 这里我们选择  ASP.NET Core Web Application (.NET Core) ...

  4. MS SqlServer学习笔记(索引)

    1.索引分类 MS SqlServer提供了两种索引:聚集索引和非聚集索引: 聚集索引是将数据按照索引的顺序存放 非聚集索引是将索引和数据分离存放,通过指针将二者联系到一起. 因为两种索引对比: 使用 ...

  5. Ms SQLServer中的Union和Union All的使用方法和区别

    Ms SQLServer中的Union和Union All的使用方法和区别 SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 ...

  6. Linux下PHP连接MS SQLServer的办法

    Linux下PHP连接MS SQLServer的办法分析问题 本来PHP脚本读写SQLServer是没有什么问题的,在Apache for windows和Windows IIS下可以工作的很好,一般 ...

  7. 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合

    在开发项目的时候,往往碰到的不同的需求情况,兼容不同类型的数据库是我们项目以不变应万变的举措之一,在底层能够兼容多种数据库会使得我们开发不同类型的项目得心应手,如果配合快速的框架支持,那更是锦上添花的 ...

  8. oracle直接读写ms sqlserver数据库(一)如何下载oracle database gateway for sqlserver

    想从Oracle实时同步数据到Ms Sqlserver,需要在Oracle里面直连Sqlserver进行数据的读写,可以在Oracle服务器上安装oracle database gateway for ...

  9. c# 使用MS SqlServer,连接成功,但是还报异常A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0。。。。

    c# 使用MS SqlServer,连接成功,但是还报异常A connection was successfully established with the server, but then an ...

随机推荐

  1. 开源消息队列:NetMQ

    NetMQ 是  ZeroMQ的C#移植版本. ZeroMQ是一个轻量级的消息内核,它是对标准socket接口的扩展.它提供了一种异步消息队列,多消息模式,消息过滤(订阅),对多种传输协议的无缝访问. ...

  2. iOS开发系列--让你的应用“动”起来

    --iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...

  3. Morris.js和flot绘制折线图的比较

    [文章摘要] 最近用开源的AdminLTE做框架感觉效果特别好,其针对图表库Morris.js和flot都提供了不错的支持,也都提供了这两者的例子.不过Morris.js是基于Raphael.js来的 ...

  4. DDD领域驱动设计之领域服务

    1.DDD领域驱动设计实践篇之如何提取模型 2.DDD领域驱动设计之聚合.实体.值对象 3.DDD领域驱动设计之领域基础设施层 什么是领域服务,DDD书中是说,有些类或者方法,放实体A也不好,放实体B ...

  5. vmware 安装xp 流水账

    1. 分区 PQ分区.1个区,C盘,NTFS. 2. 安装XP 进入ghost,不要选择一键. 然后fromImage, d:\xxx\GHO

  6. 模糊测试(fuzz testing)介绍(一)

    模糊测试(fuzz testing)是一类安全性测试的方法.说起安全性测试,大部分人头脑中浮现出的可能是一个标准的“黑客”场景:某个不修边幅.脸色苍白的年轻人,坐在黑暗的房间中,正在熟练地使用各种工具 ...

  7. Ubuntu 16 安装JDK1.8

    检查是否JDK已被安装: 上图表示没有安装,创建文件夹: 下载JDK: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...

  8. C语言 · 图形显示

    问题描述 编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数): * * * * * * * * * * * * * * *     #include "stdi ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (46) ------ 第八章 POCO之领域对象测试和仓储测试

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-8  测试领域对象 问题 你想为领域对象创建单元测试. 这主要用于,测试特定的数 ...

  10. 我所理解的Cocos2d-x

    我所理解的Cocos2d-x(完全基于Cocos2d-x3.0,深度剖析计算机图形学,OpenGL ES及游戏引擎架构,全面提升游戏开发相关知识) 秦春林 著   ISBN 978-7-121-246 ...