我有以下Oracle查询
SELECT *
FROM table
WHERE date_opened
BETWEEN ((TO_DATE('2011-08-01', 'yyyy-mm-dd') - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400))
AND ((TO_DATE('2011-08-31', 'yyyy-mm-dd') - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400))
几乎可以运作,但不包括日期记录2011-08-31。有任何想法吗?它可能与我如何转换我的日期字符串有关...
更新 :我真的应该说日期实际上是一个UNIX时间戳。这就是我使用86400和01-JAN-1970
的原因谢谢:)
答案 0 :(得分:5)
如果您的结果中没有包含间隔的上限,那么您可能正在构建一个相对于上限的“独占”过滤器。所以只需在上限添加一天。即。
AND ((TO_DATE(...) - to_date(...) + 1) * (86400)) - 1
在Oracle中,+1
将在日期时算术中使用一天。
注意:BETWEEN .. AND
创建了一个包容性过滤器,正如Ollie所说,但是你的算术可能会通过将事物转换为秒来改变这种行为
答案 1 :(得分:3)
您不包括在最后一天午夜之后发生的任何事情。
尝试:
AND ((TO_DATE('2011-09-01', 'yyyy-mm-dd') - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400) - 1)
答案 2 :(得分:1)
您只想比较不带Oracle日期隐式时间戳的日期。
WHERE trunc(date_opened) BETWEEN . . .