SQL Server DateTime 参数“舍入”警告

2024-04-18

与其说是问题,不如说是警告:

今天早上我们解决了一个非常令人费解的错误。我们有各种报告,允许用户输入他们想要运行的日期范围。假设是,如果您要求提供 2010 年 8 月 1 日至 2010 年 8 月 10 日的报告,您的意思是include2010 年 8 月 10 日,因此报告的结束日期不是 8 月 10 日,而是在那之后。

它不可能是 2010 年 8 月 11 日,因为其中一些报告汇总了一天中发生的所有情况,并按当天午夜进行分组,因此每日汇总将包括额外的一天 - 这不是我们想要的。

为了避免在接近一天结束时遗漏任何项目的可能性,我们将结束日期计算为比明天少“一个刻度”:

public static DateTime EndOfDay(DateTime day)
{
    return day.Date.AddDays(1).AddTicks(-1);
}

在内部,这最终类似于 8/10/2010 12:59:59.9999PM

那么,当您将此 DateTime 传递给 SQL Server 中的 DATETIME 参数时,它会将值向上舍入为 8/11/2010 00:00:00!由于我们的查询使用

DateField BETWEEN @FromDate AND @ToDate

代替

DateField >= @FromDate AND DateField < @ToDate

我们看到 2010 年 8 月 1 日至 2010 年 8 月 10 日的报告包含 2010 年 8 月 11 日的项目。

我们发现真正问题的唯一方法是通过字符串来回传递日期。 DateTime.ToString() 也会进行舍入,因此我们最终得到 SQL Server 满意的 8/1/2010 12:59:59PM。

现在我们的“一天结束”方法如下所示:

public static DateTime EndOfDay(DateTime day)
{
    // Cant' subtract anything smaller (like a tick) because SQL Server rounds UP! Nice, eh?
    return day.Date.AddDays(1).AddSeconds(-1);
}

抱歉,这不是一个问题 - 只是认为有人可能会发现它有用。


这是因为 DATETIME 数据类型的准确性,其精度为 (quote http://msdn.microsoft.com/en-us/library/ms187819(v=SQL.100).aspx):

四舍五入到 0.000、0.003 的增量, 或 0.007 秒

所以,是的,在某些情况下您必须小心(例如,23:59:59.999 将四舍五入到第二天的 00:00,23:59:59.998 将四舍五入到 23:59:59.997)

SELECT CAST('2010-08-27T23:59:59.997' AS DATETIME)
SELECT CAST('2010-08-27T23:59:59.998' AS DATETIME)
SELECT CAST('2010-08-27T23:59:59.999' AS DATETIME)

从 SQL Server 2008 开始,有一个新的日期时间2 http://msdn.microsoft.com/en-us/library/bb677335(v=SQL.100).aspx数据类型的精度更高,低至 100 纳秒。

当我对包含时间元素的 DATETIME 字段进行查询时,由于这个原因,我不使用 BETWEEN 。

例如我更喜欢

WHERE DateField >= '2010-08-27' AND DateField < '2010-08-28'

代替:

WHERE DateField BETWEEN '2010-08-27' AND '2010-08-27T23:59:59.997'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server DateTime 参数“舍入”警告 的相关文章

  • SQL Server 2008。允许远程连接吗?

    我在 Windows XP Pro 机器上安装了 SQL Server 2000 和 2008 我可以在本地连接到两个数据库实例 从另一个机器 Windows 7 机器 中 我可以连接到第一个机器上的 SQL 2000 实例 但无法使用本地
  • Dapper 或 MySql 未找到包含句号“.”的存储过程。

    我有一个简单的 C 控制台 它使用 Dapper ORM 调用本地 MySql 数据库 以执行名为的存储过程users UserCreate 但是 当运行查询时 我收到一个异常 在数据库 用户 中找不到过程或函数 UserCreate Bu
  • ALTER TABLE 语句与 FOREIGN KEY 约束冲突

    为什么要添加外键tblDomare表导致此错误 ALTER TABLE 语句与 FOREIGN KEY 约束 FK tblDomare PersN 5F7E2DAC 冲突 冲突发生在数据库 almu0004 表 dbo tblBana 列
  • 存储过程错误 PLS-00201:必须声明标识符“UTL_HTTP”

    我正在尝试创建一个从服务请求一些 XML 数据的存储过程 我在网上找到了几个示例 它们都指向使用这个 UTL HTTP 包 但是 每次我尝试用它来编译我的存储过程时 我都会收到错误 PLS 00201 identifier UTL HTTP
  • 无法与重定向器建立连接。确保“sql browser”服务正在运行

    所以我尝试这个 sql server 2012 由于这个错误我无法打开任何 ssis 包 无法与重定向器建立连接 确保 sql browser 服务正在运行 我的 Sql 浏览器肯定正在运行 我尝试在本地服务 本地系统和网络下更改它 仍然没
  • C# 和 SQL Server:如果字符串值为空,如何在命令参数中插入 DBNull.Value?

    我已经搜索了几个小时 但找不到解决方案 我正在将一些字符串插入 SQL 但是有时 我用来执行此操作的方法可能包含空字符串 即 因此我想在 SQL Server 中插入一个空值 首先我测试我的方法以确保我能够插入DBNull Value通过使
  • 如何向 SQL 连接字符串添加自定义属性?

    我想在 SqlServer 连接字符串中添加一些自定义属性 如下所示 Integrated Security SSPI Extended Properties SomeAttr SomeValue Persist Security Info
  • SQL-Server:备份集保存现有数据库以外的数据库的备份

    我正在尝试恢复数据库的 SQL Server 备份文件 但它抛出如下错误 备份集保存除现有数据库之外的数据库的备份 我的数据库是SQL Server 2008 备份文件是2005年的 可能是什么问题 我也遇到过这个问题 解决方案 不要创建空
  • 跳过行:将数据从 SSIS 导出到 Excel 文件

    我正在尝试使用 SSIS 将数据从 SQL Server 数据库导出到 Excel 文件中 我希望从第 6 行插入数据 第 5 行有标题 我可以映射标题名称Excel 目标编辑器 通过编写 SQL 命令到 SQL 表头 SELECT FRO
  • 我可以使用 Order by 对存储过程结果进行排序吗?

    简单来说 我有这样的SQL语句 EXEC xp cmdshell tasklist 我们可以使用以下命令对结果进行排序或过滤吗order by or where Thanks 我检查了 jamietre 链接 这是完整的答案 Create
  • SQL存储过程执行时间差异

    我在 win form 应用程序中遇到奇怪的问题 我正在调用一个存储过程 并且执行大约需要 6 秒 此存储过程接受多个参数 包括一个输出参数 从应用程序级别我使用 Dim dt1 DateTime Now cmd ExecuteNonQue
  • ADO.NET SQLServer:如何防止关闭的连接持有S-DB锁?

    i Dispose http msdn microsoft com en us library system data sqlclient sqlconnection close aspx一个 SqlConnection 对象 但是当然它并
  • 如何从 Laravel 执行存储过程

    我需要在表单提交数据后执行存储过程 我让存储过程按照我想要的方式工作 并且我的表单正常工作 我只是不知道从 laravel 5 执行 sp 的语句 它应该是这样的 执行 my stored procedure 但我似乎在网上找不到类似的东西
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 如何将 SQL Server 中同一表中的一列插入到另一列中

    我需要将一列的数据插入到同一个表中的另一列中 谁能告诉我这个怎么写 Thanks UPDATE table SET col 2 col 1
  • 在 SQL Server Management Studio 中格式化 SQL

    在 Visual Studio 和其他 IDE 中 您可以使用键盘快捷键 通过菜单或在键入时自动设置代码格式 我想知道是否有办法在 SQL Server Management Studio 中启用此标准功能 我正在处理一些大型存储过程 这些
  • 使用 DateTime 类计算日期差异时出错

    我正在尝试使用 DateTime 类 php gt 5 3 来计算 2 个日期的差异 手册中的示例简单明了 我尝试了该示例并且效果很好 但如果改变开始和结束日期 就会出现问题 this gt start date 2011 03 01 th
  • 触发器与非规范化存储过程的优缺点

    当涉及到对事务数据库中的数据进行非规范化以提高性能时 至少 有三种不同的方法 通过存储过程推送更新 更新规范化交易数据和非规范化报告 分析数据 在事务表上实现更新辅助表的触发器 这几乎总是维护历史时所采取的路线 将处理推迟到夜间批处理 可能
  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应
  • 如何在审计触发器中使用system_user但仍使用连接池?

    我想做以下两件事 在我的数据库表上使用审计触发器来识别哪个用户更新了什么 使用连接池来提高性能 对于 1 我在数据库触发器中使用 system user 来识别进行更改的用户 但这阻止我执行需要通用连接字符串的 2 有没有一种方法可以让我充

随机推荐

  • 是否可以使用计时器为 JButton 创建淡入效果?

    我想在我的程序按钮上添加一些效果 当我按下button the button应该淡入 Using a timer改变的值Opaque in new Color 是一种方式 但是可以应用于JButton还有 因为JButton有边界 所以我想
  • 分配后列表被意外清除[重复]

    这个问题在这里已经有答案了 class ListHolder public List
  • 应用程序中所有国家/地区的城市和邮政编码

    有没有一种方法可以将所有国家 州 城市的邮政编码存储在一个数据库中 我一直在到处寻找 我发现地名网 http www geonames org 我猜其中包含了所有内容 但无法直接获取该数据 我正在使用导轨 如果有任何助手或插件就太好了 如果
  • 更改 iOS 中的应用程序语言设置而不是整个设备

    我希望在我的应用程序中可以选择更改我的应用程序语言 只是应用程序语言而不是整个系统 请给我一些提示好吗 提前致谢 我知道本地化 您可以使用从 Xcode 设置的自定义构建标志来完成此操作 这样您就可以在本地化下运行应用程序 而无需更改设备的
  • 当我单击数据表中的下一页时,我的 jquery 选择器不再工作

    我在用着数据表 http www datatables net jquery 插件在页面上显示我的数据 当有人单击一行时 我有这个选择器 myTable tr class tableHeader click function alert c
  • 多线程程序中的 std::string

    鉴于 1 C 03标准没有以任何方式解决线程的存在 2 C 03 标准将其留给实现来决定是否std string应该在其复制构造函数中使用 Copy on Write 语义 3 写时复制语义通常会导致多线程程序中不可预测的行为 我得出以下看
  • 为什么要使用Promise.resolve().then()?

    在阅读 Angular 指令的代码时路由器链路激活 https github com angular angular blob master packages router src directives router link active
  • 释放 GCD 调度队列属性的正确方法是什么?

    我正在使用一个dispatch queue 它是通过其所有者的属性访问的 如下所示 property nonatomic assign dispatch queue t queue 请注意assign关键词 队列在对象的整个生命周期中使用
  • 嵌套属性未以简单形式显示

    鉴于以下情况 Models class Location lt ActiveRecord Base has many games end class Game lt ActiveRecord Base validates presence
  • 如何获取 BTreeSet 中元素的下界和上限?

    正在阅读BTreeSet文档 我似乎无法弄清楚如何从 a 中获取大于元素的最小值或小于元素的最大值BTreeSet在对数时间内 我看到有一个range https doc rust lang org std collections stru
  • 将 Elmah 与 WebApi 结合使用时,错误会记录两次

    我正在尝试使用 elmah 记录我的 asp net web api 项目中的异常 我遇到的问题是每个错误都会记录两次 我正在使用 Elmah Contrib Web Api 我的应用程序类如下 public class WebApiApp
  • 用 R 计算年龄

    我在 R 中有两个数据帧 其中一个数据帧包含一个人的出生年份 YEAR 1931 1924 然后另一列显示最近的时间 RECENT 09 08 2005 11 08 2005 我想做的是减去年份 以便我可以计算他们的年龄 但我不知道如何处理
  • Rails respond_with:它是如何工作的?

    我到处读到关于它有多酷的内容respond with方法在 Rails 3 中 但我什至无法在 Rails API 中或通过搜索源代码找到对它的引用 任何人都可以向我解释它是如何工作的 您可以使用哪些选项等 或者向我指出它实际实现的位置 以
  • 在事务结束时发送事件

    我有一个服务对象的接口 如下所示 为简洁起见进行了简化 public interface ItemService public Item getItemById String itemId int version public void c
  • 部署到 Docker 时外部化 Spring Boot 属性

    在我的 Spring Boot 应用程序中 我想将属性外部化以在 Docker 容器中运行 首次部署时 当前的属性my server src main resources application yml由应用程序按预期加载和使用 一切正常
  • 如何修复这个已有 8 年历史的 VBA 64 位编译器错误?

    所以这就是错误 64 BitVBA主机 例如Access 365 64位或Excel 2016 64位 创建类模块SomeClass this needs to be here to trigger the bug Private Sub
  • Hashmap 单键保存一个类。计算密钥并检索计数器

    我正在开发一个数据库自我项目 我有一个来自以下位置的输入文件 http ir dcs gla ac uk resources test collections cran http ir dcs gla ac uk resources tes
  • 将数据表保存到文本文件的最短方法

    我刚刚找到了一些答案 但发现它们都非常长并且有很多迭代 所以我想出了自己的解决方案 将表转换为字符串 string myTableAsString String Join Environment NewLine myDataTable Ro
  • JavaScript 中的封装

    很久以前 我看到有人用如下代码封装了整个 JavaScript 块 function this 问题 上面的代码正确吗 像上面提到的那样封装整个 JavaScript 块有什么好处 对 那是正确的 它称为自调用匿名函数表达式 JavaScr
  • SQL Server DateTime 参数“舍入”警告

    与其说是问题 不如说是警告 今天早上我们解决了一个非常令人费解的错误 我们有各种报告 允许用户输入他们想要运行的日期范围 假设是 如果您要求提供 2010 年 8 月 1 日至 2010 年 8 月 10 日的报告 您的意思是include