搜索中的sql日期时间格式会产生不同的结果

时间:2016-07-22 23:26:35

标签: sql where-clause milliseconds

我运行了一个查询,其中我想查找从6月1日开始生成的所有订单。最初我使用了此代码:

select blah blah
Where ORDERS.ORDER_DATE > '2016-05-31 23:59:59.999'

但查询无法选择6月1日发出的订单。当我更改代码时:

Where ORDERS.ORDER_DATE > '2016-05-31 23:59:59.99'

我收到了6月1日的订单。差异是最后的_2_ nines (.99)_3_ nines (.999)在几分之一秒内的差异。数据总是显示分数中的3个数字。 (我们的数据仅显示零秒"XX:XX:XX.000"

中的零

这里发生了什么?

3 个答案:

答案 0 :(得分:0)

我在尝试构建日期范围时也见证了精度问题,所以我选择简化它。我确定你已经考虑过了这个

Select ... ORDERS.ORDER_DATE >= '2016-06-01'

答案 1 :(得分:0)

对于sql-server,任何超过.997毫秒的内容都会向上舍入,所以' 2016-05-31 23:59:59.999'评估方式与' 2016-06-01 00:00:00.000'相同。结合您的数据可能只有DATE,因此您不会得到2016-06-01

由于

select blah blah
Where ORDERS.ORDER_DATE > '2016-05-31 23:59:59.999'

将被评估为

select blah blah
Where ORDERS.ORDER_DATE > '2016-06-01 00:00:00.000'

因此,如果您的DATE不大于6/1,则无法获得结果

为什么.99可以使用bacuase

select blah blah
Where ORDERS.ORDER_DATE > '2016-05-31 23:59:59.99'

评估为

select blah blah
Where ORDERS.ORDER_DATE > '2016-05-31 23:59:59.990'

答案 2 :(得分:0)

你不能假设精确度。当您的日期字符串转换为日期时间时,它最终为“2016-06-01”。我猜你的订单没有时间组件,所以他们也有'2016-06-01',因为你正在做ArrayList你错过了它们。 datetime docs显示时间范围为>。试试看:

00:00:00 through 23:59:59.997

正确的方法是使用您想要的确切开始时间,然后使用CREATE TABLE test_date ( dt datetime ); insert into test_date values ('2016-05-31 23:59:59.999') select * from test_date -- result: 'June, 01 2016 00:00:00' ,并使用>=作为结束日期以及下一期间的确切开始时间。

<

无论您使用什么日期类型存储ORDER_DATE,并且将数据库移动到另一个可能对日期时间对象的时间部分具有不同精度的系统,这都将有效。