从oracle表中查找每周的身份验证日志计数

时间:2017-06-01 08:54:32

标签: sql oracle

我有一个如下表格,我需要找到每周的数据计数。

Name                Null Type          
------------------- ---- ------------- 
DATE_ENTERED             VARCHAR2(100) 
TIME_ENTERED             VARCHAR2(100) 
USER_ID                  VARCHAR2(100) 
STATUS                   VARCHAR2(100) 
FAILEDLOGINATTEMPTS      VARCHAR2(100) 
ACCOUNTLOCKED            VARCHAR2(100) 
RESPONSECODE             VARCHAR2(100) 

任何人都可以告诉我如何查找每周计数,每日计数查询如下。

(select "DATE", sum("SUCCESS COUNT") as "SUCCESS COUNT", sum("FAILURE 
COUNT") as "FAILURE COUNT", sum("LOCKED COUNT") as "LOCKED COUNT"
from (select to_char(to_date(date_entered,'YYYY-MON-DD'),'YYYY-MON-DD') as 
"DATE", decode(status,'Success',1,0) as "SUCCESS COUNT", 
decode(status,'Success',0,1) as "FAILURE COUNT", 
decode(accountlocked,'1',1,0) as "LOCKED COUNT" 
from invest_sixmonths  ) t1
group by "DATE") order by "DATE";

2 个答案:

答案 0 :(得分:0)

首先,将字符串列用于日期数据类型并不是一个好主意,因为它将来会给你类似的问题。

现在回到问题,当您执行to_char(to_date(date_entered||' '||TIME_ENTERED,'YYYY-MON-DD HH24:MI:SS'),'YYYY-MON-DD HH24') AS "DATE"时,您只从hourdate级联中提取一天中的time部分。因此group by此派生列应该为您提供聚合值group by小时。

例如

select to_char
        (to_date(
                    date_entered||' '||TIME_ENTERED,
                    'YYYY-MON-DD HH24:MI:SS
                    ')
                    ,'YYYY-MON-DD HH24'
        ) 
from
(select '2017-JAN-01' as date_entered
           ,'21:43:54' as time_entered 
from dual)

这将为您2017-JAN-01 21提供group by。所以你已经得到了hourly结果。

但是,如果您使用trunc提取hour,如下所示会更好

select  trunc(to_date(
                    date_entered||' '||TIME_ENTERED,
                    'YYYY-MON-DD HH24:MI:SS
                    ')

        ,'HH24')
from
(select '2017-JAN-01' as date_entered
           ,'21:43:54' as time_entered 
from dual)

输出的数据类型为date,它将被截断为最接近的小时。在NLS_DATE_PARAMETERDD-MON-YY HH24:MI:SS的客户端,我看到了这一点。

23-JAN-17 21.00.00

group by

中使用此功能

答案 1 :(得分:0)

使用TRUNC()将日期截断为小时开头,然后GROUP BY

SELECT TRUNC( TO_DATE( date_entered || time_entered, 'YYYY-MON-DDHH24:MI:SS' ), 'HH24' )
         AS "DATE",
       COUNT( CASE status WHEN 'Success' THEN 1 END ) AS success_count,
       COUNT( CASE status WHEN 'Success' THEN NULL ELSE 1 END ) AS failure_count,
       COUNT( CASE accountlocked WHEN '1' THEN 1 END ) AS locked_count
FROM   invest_logs
GROUP BY
       TRUNC( TO_DATE( date_entered || time_entered, 'YYYY-MON-DDHH24:MI:SS' ), 'HH24' )
ORDER BY
       "DATE"

您也可以使用TO_CHAR()

TO_CHAR(
  TO_DATE( date_entered || time_entered, 'YYYY-MON-DDHH24:MI:SS' ),
  'YYYY-MON-DD HH24'
) AS "DATE",