SQL Server中查询结果超出了查询时间范围解决方法

废话少说,直接上SQL代码(有兴趣的测试验证一下),下面这个查询语句为什么将2008-11-27的记录查询出来了呢?这个是同事遇到的一个问题,个人设计了一个例子。

USE AdventureWorks2014;
GO
SELECT * FROM [Person].[Person]
WHERE ModifiedDate >= '2008-11-26 00:00:00:000'
 AND ModifiedDate <= '2008-11-26 23:59:59.999'

其实如果细看过文档的话,应该知道是什么原因,因为数据类型Datetiem的时间范围:00:00:00 到 23:59:59.997 , 最后部分的范围为0 ~997,官方文档提示,datetime的秒的小数部分精度的有舍入,具体请见下面

datetime 秒的小数部分精度的舍入

如下表所示,将 datetime 值舍入到 .000、.003、或 .007 秒的增量 。

用户指定的值

系统存储的值

01/01/98 23:59:59.999

1998-01-02 00:00:00.000

01/01/98 23:59:59.995

01/01/98 23:59:59.996

01/01/98 23:59:59.997

01/01/98 23:59:59.998

1998-01-01 23:59:59.997

01/01/98 23:59:59.992

01/01/98 23:59:59.993

01/01/98 23:59:59.994

1998-01-01 23:59:59.993

01/01/98 23:59:59.990

01/01/98 23:59:59.991

1998-01-01 23:59:59.990

实验测试验证,998会转换为997,而'2008-11-26 23:59:59.999'的话,就会转换为'2008-11-27 00:00:00.000',如下截图所示,所以尤其对数据精确性有要求的地方,要注意这些地方,否则SQL语句得出的结果在逻辑上就有误。

官方文档https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15 中也有描述不准确的地方,如下截图所示:

其实这个是精度问题,如果选择datetime2数据类型,它默认的小数精度更高,不会遇到这个问题,更多细节建议参考官方文档(下面参考资料)

参考资料:

https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime2-transact-sql?view=sql-server-ver15

https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver15

以上就是本次介绍的关于SQL Server查询超时的知识点内容,感谢大家的而学习和对我们的支持。

(0)

相关推荐

  • C#访问SqlServer设置链接超时的方法

    本文实例讲述了C#访问SqlServer设置链接超时的方法.分享给大家供大家参考.具体实现方法如下: 下面这段代码设置超时时间为60秒,默认为30秒 using (connection) { SqlCommand sqlcommand = connection.CreateCommand(); sqlcommand.CommandTimeout = 60; //默认时间为 30 秒 sqlcommand.CommandText = sqlText; ... 希望本文所述对大家的C#程序设计有所帮

  • sqlserver 2005连接超时采用bat命令解决

    将以下内容保存为 openSql.bat 双击运行即可 复制代码 代码如下: @echo ========= SQL Server Ports =================== @echo Enabling SQLServer default instance port 1433 netsh firewall set portopening TCP 1433 "SQLServer" @echo Enabling Dedicated Admin Connection port 14

  • SQL Server 磁盘请求超时的833错误原因及解决方法

    最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的errorlog中出现磁盘请求超过15s才完成的error消息. 对于此类问题,到底是存储系统或者磁盘的故障,还是SQL Server 自己的问题,亦或是应用程序引发的呢?又要如何解决? 本文将对引起此问题的某一方面的因素进行简单的分析,但是无法涵盖所有潜在的可能性,因此遇到类似问题还要做具体的分析. SQL Server中的磁盘请求超时 该错误的英文版的错误信息如下: SQL Server has e

  • SQL Server中避免触发镜像SUSPEND的N种方法

    背景: 我们在使用数据库的过程中,很多时候要追求性能,特别在处理大批量数据的时候更希望快速处理.那么对SQL SERVER而言,数据库实现大批量插入的优化方案,这里特别介绍通过大容量插入的一种方式. 基本原理: 简单恢复模式按最小方式记录大多数大容量操作,对于完整恢复模式下的数据库,大容量导入期间执行的所有行插入操作被完整地记录到事务日志中.如果数据导入量较大,会导致迅速填满事务日志.对于大容量导入操作,按最小方式记录比完整记录更有效,并减少了大容量导入操作填满日志空间的可能性,所以性能会得到极

  • 在SQL Server中使用命令调用SSIS包的具体方法

    具体操作步骤如下: 1.首先,当然是要在Business Intelligence中设计好包,并调试通过. 2.然后,有两种方式可以在SQL Server中使用命令运行SSIS包 第一种是直接执行ssis包文件,命令如: exec xp_cmdshell 'dtexec /f "c:\test.dtsx"' 第二种是将包文件发布或者导入到Integration Services服务中,然后再执行. 发布包是在Business Intelligence中生成发布文件,并发布到Integr

  • SQL Server中Table字典数据的查询SQL示例代码

    前言 在数据库系统原理与设计(第3版)教科书中这样写道: 数据库包含4类数据: 1.用户数据 2.元数据 3.索引 4.应用元数据 其中,元数据也叫数据字典,定义如下: 下面这篇文章就来给大家分享一个关于查询SQL Server Table 结构的SQL 语句. T-SQL 如下: SELECT (case when a.colorder=1 then d.name else '' end) 表名, a.colorder 字段序号,a.name 字段名, (case when a.colorde

  • SQL Server中统计每个表行数的快速方法

    我们都知道用聚合函数count()可以统计表的行数.如果需要统计数据库每个表各自的行数(DBA可能有这种需求),用count()函数就必须为每个表生成一个动态SQL语句并执行,才能得到结果.以前在互联网上看到有一种很好的解决方法,忘记出处了,写下来分享一下. 该方法利用了sysindexes 系统表提供的rows字段.rows字段记录了索引的数据级的行数.解决方法的代码如下: 复制代码 代码如下: select schema_name(t.schema_id) as [Schema], t.na

  • SQL Server数字开头的数据库表名的解决方法

    今天遇到了个郁闷的问题,关于数据库表名的问题. SQL Server的数据库的表名可以用数字开头,但是在查询的时候,不能直接写表名,如下: select *         form 1_tablename 在执行过程中,报错.但是给表名加上中括号,就可以了,如下: select *         from [1_tablename] 用VS中的DataSet开发时,会自动生成SQL语句,但是生成的SQL语句中,有的加上方括号,但是有的没有加, 这在程序执行过程中,就不能确定语句的正确性,而且

  • SQL Server 2012 sa用户登录错误18456的解决方法

    最近想研究下SQL SERVER2012 Enterprise版本的数据库,听说功能很强大.我是在win7上安装的,安装的过程很顺利,我在用"Windows 身份验证"时,一切OK,但是在用SA用户登录数据库的时候出现如下的错误: 之前装过SQL7.0, SQL2000, SQL2005版的.2008版的,好像没有这复杂啊,百度了下找到了一个解决方案,归纳一下:这个错误一般由三个原因引起,登录方式设置错误.sa设置错误和IP方式是否开启,下面依次解决这三个问题. 解决方案: 一.登录方

  • SQL Server 2005 安装遇到的错误提示和解决方法

    安装SQL Server 2005弄了好久,终于可以了...期间问题重重,想拿出来和大家一同分享的. 第一种错误显示: 无法在com+目录中安装和配置程序集 错误:-2146233087 无法在com+目录中安装和配置程序集c:\program files\Microsoft SQL Server\90\DTS\tasks\microsoft.sqlserver.MSMQTASK.DLL.  错误:-2146233087 sql server 安装时"无法在COM+目录中安装和配置程序"

  • SQL Server 2008登录错误:无法连接到(local)解决方法

    在一些朋友安装完SQL Server 2008之后大多会遇到连接出错的问题.特别对于我们这样的新手而言简直郁闷的要死,好不容易装玩了又出现了问题.此篇文章意在解决安装步骤没有问题,但安装后无法登录的问题. 在解决问题之前请朋友们打开服务窗口,看"SQL Server"主服务是否打开,如下图. 若服务已经打开还是用"SQL Server 身份验证"和"Windows 身份验证"都无法登录请看下面的步骤. 往往这时,服务器类型我们选择了"数

  • sql server中判断表或临时表是否存在的方法

    1.判断数据表是否存在 方法一: use yourdb; go if object_id(N'tablename',N'U') is not null print '存在' else print '不存在' 例如: use fireweb; go if object_id(N'TEMP_TBL',N'U') is not null print '存在' else print '不存在' 方法二: USE [实例名] GO IF EXISTS (SELECT * FROM dbo.SysObjec

  • 在SQL Server中查询资料库的TABLE数量与名称的sql语句

    在SQL Server中 每一个database裡都有一个系统所产生的table sysobjects这一个table中记录了database中所有的table名称 我们可以用下面的SQL语法作查询的动作 复制代码 代码如下: Select Name,id from sysobjects where xtype = 'U' 其中xtype='U'代表使用的table,若是使用xtype='S' 则代表系统预设的table 在系统table中还有一个名叫syscolumns的table 他记录了栏

随机推荐