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_date
与 date
进行比较,而不是字符串,这样您就不会进行隐式转换。
【讨论】:
【参考方案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 按分钟而不是每天分组的主要内容,如果未能解决你的问题,请参考以下文章