SQL Oracle-仅显示今天前15天的数据

时间:2020-06-26 14:53:55

标签: oracle datetime

我正在尝试获取数据,但仅限一天-今天之前的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%知道如何修改我的语句以获取所需的数据。提前加油。

2 个答案:

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

Oracle中的

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')

然后应该清楚错误在哪里。由于您不提供任何样本数据,因此很难提供一种现成的解决方案。