Oracle 按分钟而不是每天分组

Posted

技术标签:

【中文标题】Oracle 按分钟而不是每天分组【英文标题】:Oracle Group By Minute Instead of Per day 【发布时间】:2021-10-31 18:09:51 【问题描述】:

我写了一个查询来获取每天收到的数据。

alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss';
SELECT to_CHAR(created_date, 'yyyy/mm/dd'), status_code, COUNT(workflow_txn_id_log)
FROM workflow_txn_log
WHERE status_code = 'DOWNLOAD_ALL' AND created_date > '2021/08/11'
GROUP BY  to_CHAR(created_date, 'yyyy/mm/dd'), status_code
ORDER BY to_CHAR(created_date, 'yyyy/mm/dd');

现在我想获取按升序排列的每一分钟的数据。我试图更改日期格式,但没有任何效果。我该怎么做?

【问题讨论】:

created_date的数据类型是什么? to_CHAR(created_date, 'yyyy/mm/dd') 预计它将是 DATE,但是您不应该将其与 字符串 created_date > '2021/08/11' 进行比较 试试GROUP BY to_CHAR(created_date, 'yyyy/mm/dd HH24:MI')GROUP BY TRUNC(created_date, 'MI') 【参考方案1】:

听起来像你想要的

SELECT trunc(created_date, 'mi') created_minute, 
       status_code, 
       COUNT(workflow_txn_id_log)
  FROM workflow_txn_log
 WHERE status_code = 'DOWNLOAD_ALL' 
   AND created_date > date '2021-08-11'
GROUP BY  trunc(created_date, 'mi'), status_code
ORDER BY  trunc(created_date, 'mi');

trunc(created_date, 'mi') 返回一个被截断为分钟的date(即秒设置为 0)。这意味着order by 将使用日期比较语义对日期进行排序,而不是您想要的字符串比较语义。 where 子句将 created_datedate 进行比较,而不是字符串,这样您就不会进行隐式转换。

【讨论】:

【参考方案2】:

如果您想以格式化字符串的形式获取日期,请使用 TO_CHAR 并包含小时和分钟:

SELECT TO_CHAR(created_date, 'yyyy/mm/dd hh24:mi'),
       status_code,
       COUNT(workflow_txn_id_log)
FROM   workflow_txn_log
WHERE  status_code  = 'DOWNLOAD_ALL'
AND    created_date > DATE '2021/08/11'
GROUP BY
       TO_CHAR(created_date, 'yyyy/mm/dd hh24:mi'),
       status_code
ORDER BY
       TO_CHAR(created_date, 'yyyy/mm/dd hh24:mi');

如果您希望日期为 DATE 数据类型,则 TRUNC将值设为分钟(并将秒归零):

SELECT TRUNC(created_date, 'MI'),
       status_code,
       COUNT(workflow_txn_id_log)
FROM   workflow_txn_log
WHERE  status_code  = 'DOWNLOAD_ALL'
AND    created_date > DATE '2021/08/11'
GROUP BY
       TRUNC(created_date, 'MI'),
       status_code
ORDER BY
       TRUNC(created_date, 'MI');

注意:DATE 是二进制数据类型,没有格式存储。某些客户端应用程序(即 SQL Developer 或 SQL/Plus)可能会选择使用 NLS_DATE_FORMAT 会话参数来显示日期格式,但这是客户端应用程序的功能而不是数据库的功能,并且不能依赖于在不同客户端之间提供一致的行为(即NLS_DATE_FORMAT 参数不会影响在 Java、C#、php、Python 等中显示日期)。

【讨论】:

以上是关于Oracle 按分钟而不是每天分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PL/SQL 中按每天分组?

每天按列和行、计数和百分比分组

Git每天1分钟系列——Git项目分组开发

Laravel 每天按奇数小时对数据进行分组

oracle 定时任务

如何更新 OpenStack 组件?- 每天5分钟玩转 OpenStack(161)