Oracle - 从日期字符串转换时在两个日期(包括)之间选择的记录

时间:2011-09-12 08:38:16

标签: oracle

我有以下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

的原因

谢谢:)

3 个答案:

答案 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 . . .