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

时间: 2024-10-06 14:54:57

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

EF Core实践 (使用MS SqlServer)

这里使用 MS SQLSERVER ,网上大多使用 SQLite 先来一个CodeFirst 新建项目 这里我们选择  ASP.NET Core Web Application (.NET Core)  这里选择web 应用程序,然后更改身份验证 改为 不进行身份验证 然后再包管理控制台里执行下面两条命令 引用 EntityFrameworkCore Install-Package Microsoft.EntityFrameworkCore 再引用 EntityFrameworkCore.Sql

Linux下PHP连接MS SQLServer的办法

Linux下PHP连接MS SQLServer的办法分析问题 本来PHP脚本读写SQLServer是没有什么问题的,在Apache for windows和Windows IIS下可以工作的很好,一般可以通过ODBC或SQLServer Client连接,这都是Windows下面现成的.但是在Linux下面没有现成的ODBC和SQLServer Client,需要我们自己安装. 解决问题 一.相关软件 freetds-0.53.tgz 这个软件能够用Linux和Unix连接MS SQLServe

使用unidac 在linux 上无驱动直接访问MS SQLSERVER

随着delphi 10.2 开始了对Linux 的重新支持.devart 也迅速的发布了unidac 7.0, 最大的特性就是支持linux和MongoDB. 并有了其他更新: In this release we added such significant features as: The new UniDAC version includes a new MongoDB provider which allows you to work with a cross-platform docu

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

想从Oracle实时同步数据到Ms Sqlserver,需要在Oracle里面直连Sqlserver进行数据的读写,可以在Oracle服务器上安装oracle database gateway for sqlserver组件,关于如何安装此组件,网上找不到详细资料,特将我的安装过程记录下来分享给需要的网友: 1.Oracle企业版自带了gateway for odbc,但for Sqlserver版并未安装,需要到官网下载.首先打开Oracle官网,进入Oracle 11g下载首页(根据自己的版

MS SqlServer 的日期格式化函数 Convert

MS SqlServer 的日期格式化函数:Convert(data_type[(length)], expression [, style])参数:data_type[(length)]代表转换的数据类型及长度,expression代表源数据表达式,style代表要转换的日期格式样式 Select CONVERT(varchar, GETDATE(), 0): 05 16 2006 10:57AMSelect CONVERT(varchar, GETDATE(), 1): 05/16/06Se

MS SQLServer数据库结构及数据对比

关键词:SQLServer.表结构对比.数据对比.按行对比数据 简介 数据库数据对比工具(MSSQL版)是针对MS SQL Server的一款小工具,可以针对两个数据进行表结构和数据的对比. 1.表结构对比:如开发库和正式库之间的结构和数据同步,此工具可以告诉您哪个表结构有字段的增加减少,或者字段类型的改变,并生成sql进行结构的同步. 2.数据对比:如对比两个数据库中的某个表的数据差异,有差异的行会用颜色进行标记,可生成sql脚本进行两个库的同步. 下载地址 下载地址:http://www.v

MS SQLServer表数据生成Insert语句

关键词:SQLServer.表数据.生成Insert语句 反馈意见请联系:[email protected] 简介 数据库数据生成insert(MSSQL版),可将表中的数据生成insert或者update的sql脚本.比如您维护两个数据库,其中一个数据库中增加的数据也希望能够在另外一个数据中进行执行. 下载地址 下载地址:http://www.vidarsoft.cn/download/SQLInsert.zip Csdn下载地址:http://download.csdn.net/detail

oracle直接读写ms sqlserver数据库(二)配置透明网关

环境说明: 数据库版本:11gR2 透明网关版本:11g 操作系统Windows Server2008_64位 ORACLE_HOME目录:D:\app\Administrator\product\11.2.0\dbhome_1 MS数据库IP:192.168.199.245 数据库:BWONLINE 默认端口:1433 ORACLE数据库IP:172.18.123.113 服务名:db1 默认端口1521 备注:现在安装数据库后安装透明网关,透明网关安装时候的Home目录和数据库的Home目录

python访问MS SqlServer(通过pyodbc)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 5 import pyodbc 6 7 8 class MSSQL: 9 """ 10 封装pyodbc 11 """ 12 13 def __init__(self,host,user,pwd,db='master', charset='utf8'): 14 self._host = host 15 self._user = user 1