近段时间在程序中写到有关搜索的功能。其中有使用到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,在结束日期加一天,并使用小于(<)逻辑条件。

最新文章

  1. C语言学习008:标准错误
  2. C++ new(1)
  3. 移动端Web开发注意点
  4. android相机调用及存储详解
  5. POJ 2253 Difference of Clustering
  6. 6,render的一些概念和可用库
  7. Codeforces Round #326 (Div. 1) - C. Duff in the Army 树上倍增算法
  8. mybatis动态SQL的&lt;set&gt;条件
  9. Construct Binary Tree From Inorder and Preorder/Postorder Traversal
  10. openstack-kilo--issue(十二)openstack-keystone和httpd服务同时占用35357和5000
  11. NIO(五)
  12. kvm虚拟化管理平台WebVirtMgr部署-完整记录(3)
  13. Windows上结合使用Flume和Kafka
  14. (Nginx反向代理+NFS共享网页根目录)自动部署及可用性检测
  15. ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: Cannot run program &quot;hive&quot;: error=2, No such file or directory
  16. HTML5无刷新修改URL
  17. sublime设置语法自动整齐快捷键技巧
  18. VueJS 集成 medium editor 自定义编辑器按钮
  19. w3c html dom
  20. 性能调优之MySQL篇一:MySQL性能计数器

热门文章

  1. LibSVM for Python 使用
  2. MySQL MVCC(多版本并发控制)
  3. Javascript模拟继承(赠送.net吐槽一段)
  4. ASP.NET MVC学前篇之Lambda表达式、依赖倒置
  5. LVS原理与使用(1)
  6. Tomcat 让百度的域名显示自己的页面内容(玩耍篇)
  7. Ubuntu 16 安装ElasticSearch
  8. C# Azure 存储-Blob
  9. .net使用cefsharp开源库开发chrome浏览器(二)
  10. 我所理解的Cocos2d-x