|
1
5
这是因为日期时间数据类型的准确性,它具有准确性( quote ):
所以是的,在某些情况下你必须小心(例如23:59:59.999将四舍五入到第二天的00:00,23:59:59.998将四舍五入到23:59:59.997)
从SQL Server 2008开始,有一个新的 DATETIME2 数据类型,精度高达100纳秒。 当我在包含时间元素的日期时间字段上执行查询时,出于这个原因,我不使用between。 我更喜欢
而不是:
|
|
|
2
2
不幸的是,您发布的解决方案添加了另一个新的、微妙的问题,最终会回来咬你:现在,您将跳过所有日期,即>=23:59:59.003和<=23:59:59.997。我强烈地怀疑你可以减去小于1秒的东西,这是3个滴答,除非你做的是减少额外时间的事情。注意smalldatetime甚至不会存储秒。 在处理边界边缘时,利用表示该值的系统的“已知分辨率”来模拟具有包含值的排他端点是不好的。在转换具有不同分辨率的两个代表性系统时,您发现了这一点。最佳实践方法是直接向上到边界,但不包括边界,使用普通比较运算符。
所以,正如其他海报所说,正确的答案是使用
包装器SP的示例如下:
您需要获得所有日期参数的列表,并决定哪些参数代表结束日期边界。如果您的SP有任何XML或表值参数,请小心。 你可以再次回到理智的世界! 注意:如果升级到SQL 2008,在可以使用datetime2数据类型之前,无论如何都需要修复所有问题。 |
|
|
3
1
SQL Server日期时间数据类型精确到333秒,即,.003,.006,.009等。这就是为什么你的.999四舍五入为0的原因。欢迎来到开发人员(又称“我们所有人”)的行列中,这个实现一次又一次地把它们搞得一团糟。 |
|
4
1
可存储的最大子秒值
所以使用
你最好使用
|
|
John D · 需要为NULL或NOT NULL的WHERE子句 1 年前 |
|
Marc Guillot · 记录值时忽略冲突 1 年前 |
|
|
Fachry Dzaky · 正确使用ROW_NUMBER 1 年前 |
|
|
TriumphTruth · 从满足特定条件的数据集中选择1行 1 年前 |