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,在结束日期加一天,并使用小于(<)逻辑条件。

  • 相关阅读:
    进程的经典同步问题
    数学余数在计算机的用途
    7.货仓选址 绝对值不等式
    6. 排队打水 排序不等式
    5.合并果子 Huffman树
    4.区间覆盖 区间问题
    3.区间分组 区间问题
    2.最大不相交区间数量 区间问题
    1.区间选点 区间问题
    26.拆分-Nim游戏 博弈论
  • 原文地址:https://www.cnblogs.com/insus/p/5975977.html
Copyright © 2011-2022 走看看