近段时间在程序中写到有关搜索的功能。其中有使用到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. ios获取左右眼图片景深图

    cv::Mat leftMat,rightMat,depthMapMat; UIImageToMat(leftImage, leftMat); UIImageToMat(rightImage, rig ...

  2. 生活中的OO智慧——大话面向对象五大原则

    世间万物,以俗眼观纷纷各异,以道眼观种种是常.面向对象思想不仅是编程的智慧,同样也是人生的智慧.通过生活去领悟面向对象的智慧,以面向对象的智慧来指导生活. (部分图片取自How I explained ...

  3. 完成AngularJS with MVC 5, Web API 2项目

    经过接近两个月的日夜奋战,完成AngularJS with MVC 5, Web API 2的项目,这也是进入公司以后最大的一个项目,从项目需求.用户Prototype/Demo,招人,开发完成,可谓 ...

  4. 如何设计一门语言(十)——正则表达式与领域特定语言(DSL)

    几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情. 创建DSL恐怕是很多人第一次设计一门语言的经历,很少有人一 ...

  5. logistic回归

    logistic回归 回归就是对已知公式的未知参数进行估计.比如已知公式是$y = a*x + b$,未知参数是a和b,利用多真实的(x,y)训练数据对a和b的取值去自动估计.估计的方法是在给定训练样 ...

  6. C语言 · 最小公倍数

    问题描述 编写一函数lcm,求两个正整数的最小公倍数. 样例输入 一个满足题目要求的输入范例.例:3 5 样例输出 与上面的样例输入对应的输出.例: 数据规模和约定 输入数据中每一个数的范围. 例:两 ...

  7. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  8. RX(一)

    建议,先去了解观察者模式. 前期工作:引入RX的包 build.gradle脚本里面的 dependencies{ compile 'io.reactivex:rxjava:1.1.0'compile ...

  9. Uiautomator 2.0之UiObject2类学习小记

    1. 基础动作 1.1. 相关API介绍 API 说明 clear() 清楚编辑框内的内容 click() 点击一个对象 clickAndWait(EventCondition<R> co ...

  10. SmtpClient发邮件时为什么用MailMessage.From而不用MailMessage.Sender

    今天在看C#高级编程(第9版)的时候,在768页看到这样的一段代码 SmtpClient sc = new SmtpClient(); sc.Host = "邮箱服务器地址"; M ...