zoukankan      html  css  js  c++  java
  • MS SQLServer的关键词BETWEEN的一些注意事项

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

  • 相关阅读:
    LeetCode 189. Rotate Array
    LeetCode 965. Univalued Binary Tree
    LeetCode 111. Minimum Depth of Binary Tree
    LeetCode 104. Maximum Depth of Binary Tree
    Windows下MySQL的安装与配置
    LeetCode 58. Length of Last Word
    LeetCode 41. First Missing Positive
    LeetCode 283. Move Zeroes
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
    删除docker下的镜像
  • 原文地址:https://www.cnblogs.com/insus/p/5975977.html
Copyright © 2011-2022 走看看