当我运行以下查询时:

select trunc(create_date), count(*) as num_created
from mytable WHERE create_date >= (sysdate -9)
group by trunc(create_date) order by 1;

输出:

06-MAR-24   7
07-MAR-24   1826
08-MAR-24   1135
09-MAR-24   1253
10-MAR-24   1119
11-MAR-24   1446
12-MAR-24   1400
13-MAR-24   2498
14-MAR-24   1633
15-MAR-24   616

当我运行下面的查询:

select trunc(create_date), count(*) as num_created
from mytable WHERE create_date >= (sysdate -10)
group by trunc(create_date) order by 1;

输出:

05-MAR-24   165
06-MAR-24   1020
07-MAR-24   1826
08-MAR-24   1135
09-MAR-24   1253
10-MAR-24   1119
11-MAR-24   1446
12-MAR-24   1400
13-MAR-24   2498
14-MAR-24   1633
15-MAR-24   616

想知道为什么3月6日的数字从7变成了1020.(依此类推)我在这里错过了什么,或者做错了什么?

推荐答案

在Oracle中,DATE是一种二进制数据类型,由7个字节组成,分别代表世纪、世纪、月、日、小时、分钟和秒.它ALWAYS包含这7个组件,并且它NEVER以人类可读的格式存储.

当你使用SYSDATE - 10时,你将从当前瞬间减go 10天,它将具有相同的时间分量,所以:

SELECT SYSDATE,
       SYSDATE - 10,
       TRUNC(SYSDATE - 10)
FROM   DUAL

输出:

SYSDATE SYSDATE-10 TRUNC(SYSDATE-10)
2024-03-15 22:34:11 2024-03-05 22:34:11 2024-03-05 00:00:00

以及:

WHERE create_date >= sysdate - 10

将获得从当前时刻起最近10天的所有结果;这意味着您将获得一天的部分结果.

如果你想要一整天,那么使用TRUNC将时间分量截断为午夜:

WHERE create_date >= TRUNC(sysdate -10)

fiddle

Sql相关问答推荐

基于模式或其他行集的数据复制

如何连接第二个表并将其内容输入到第一个表的单个字段中?

出现5次后,将所有正斜杠替换为连字符

如何在不更改S代码的情况下,判断存储过程调用了多少次clr函数?

SQL SELECT MOST NEST TIMESTAMP BEAT ORDER

使用DatePart函数对日期时间值进行分组

如何将我的联接数据放入每个用户每月多行的列中?

在一个子查询中签入ID';S,如果未返回,则签入另一个子查询

如何用QuestDB生成蜡烛图?

如果另一个表中不存在值列,则插入失败

在WHERE EXISTS子查询中,列返回是否重要?

SQL将三个表中的三列组合为一列

删除所有订单中可用的重复值

使用特定的Order By子句随机化SQL输出

同时插入和更新记录

输出连续出现两次以上的行

POSTGRES to_timestamp() 假定 UTC 字符串为本地时间

如何使用最后一个非 NULL 值在 PostgreSQL 列中填充 NULL 值

Select 字段,除非另一个字段包含重复项

从多个连接返回 1 行到同一个表 - SQL Server