我正在尝试获取数据,但仅限一天-今天之前的15天。它必须是动态的,例如,当我今天运行查询时,我应该获得6月11日,明天6月12日的结果,等等。
我使用以下行获取前一天的数据:
bo.status_dt BETWEEN TRUNC(SYSDATE -1) AND TRUNC(SYSDATE - 1/86400)
我试图修改我的陈述,但没有运气:
bo.STATUS_DT > TRUNC(SYSDATE -15) and bo.STATUS_DT < SYSDATE +14
或
bo.status_dt = TRUNC(SYSDATE - 15)
我对Oracle还是很陌生,所以不是100%知道如何修改我的语句以获取所需的数据。提前加油。
答案 0 :(得分:3)
您尝试与
bo.STATUS_DT > TRUNC(SYSDATE -15) and bo.STATUS_DT < SYSDATE +14
应该获得比您想要的更多 数据:
select sysdate, TRUNC(SYSDATE - 15), SYSDATE + 14
from dual;
SYSDATE TRUNC(SYSDATE-15) SYSDATE+14
------------------- ------------------- -------------------
2020-06-26 11:41:29 2020-06-11 00:00:00 2020-07-10 11:41:29
因此,您将在2020-06-11 00:00:00之后和2020-07-10 11:39:33之前(但不包括)获得所有内容。
您可能想要:
bo.STATUS_DT >= TRUNC(SYSDATE -15) and bo.STATUS_DT < TRUNC(SYSDATE -14)
即减 14天;并使用>=
而不是>
准确地包含午夜:
select sysdate, TRUNC(SYSDATE - 15), TRUNC(SYSDATE - 14)
from dual;
SYSDATE TRUNC(SYSDATE-15) TRUNC(SYSDATE-14)
------------------- ------------------- -------------------
2020-06-26 11:41:29 2020-06-11 00:00:00 2020-06-12 00:00:00
因此,您将在2020-06-11 00:00:00或之后(包括2020-06-11 00:00:00)和2020-06-12 00:00:00之前获得一切-这就是整天。
使用
bo.status_dt = TRUNC(SYSDATE - 15)
仅会在2020-06-11 00:00:00正确地提供数据,而当天剩下的时间中没有任何数据。很有可能没有匹配的行。那么,您可能会想这样做:
TRUNC(bo.status_dt) = TRUNC(SYSDATE - 15)
这确实可以覆盖整个一天;但是将trunc(或任何)函数应用于表列的值将阻止使用该列的普通索引。您可以有一个基于函数的索引,但是如果已经对它进行了索引,那么这样做会比使用全天范围没有任何好处。
答案 1 :(得分:2)
DATE
值始终包括时间部分,即使默认情况下未显示也是如此。
尝试
SELECT
TO_CHAR(bo.status_dt, 'YYYY-MM-DD HH24:MI:SS'),
TO_CHAR(TRUNC(SYSDATE -1), 'YYYY-MM-DD HH24:MI:SS'),
TO_CHAR(TRUNC(SYSDATE - 1/86400), 'YYYY-MM-DD HH24:MI:SS'),
TO_CHAR(TRUNC(SYSDATE -15), 'YYYY-MM-DD HH24:MI:SS'),
TO_CHAR(SYSDATE +14, 'YYYY-MM-DD HH24:MI:SS')
然后应该清楚错误在哪里。由于您不提供任何样本数据,因此很难提供一种现成的解决方案。