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



>我正在尝试获取数据,但仅限于一天 - 今天前的第 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% 确定如何修改我的语句以获取所需的数据。提前干杯。

您的尝试

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)

减去十四天;并使用>=而不是>来准确包括午夜:

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-12 00:00:00 之前获得所有内容 - 这是一整天。

<小时 />

使用

bo.status_dt = TRUNC(SYSDATE - 15)

只会在 2020-06-11 00:00:00 为您提供数据,当天其余时间没有任何数据。很可能没有匹配的行。然后,您可能会想执行以下操作:

TRUNC(bo.status_dt) = TRUNC(SYSDATE - 15)

这确实会覆盖一整天;但是将 trunc(或任何(函数应用于表列值将阻止使用该列的正常索引。你可以有一个基于函数的索引,但如果它已经编制了索引,那么这样做而不是使用全天范围没有任何好处。

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

那么应该清楚错误在哪里。由于您不提供任何示例数据,因此很难提供即用型解决方案。

最新更新