oracle SQL获取两个日期范围之间的计数

prdp8dxp  于 2023-06-05  发布在  Oracle
关注(0)|答案(2)|浏览(289)

我需要在00:15:00和01:15:00之间获取PRODUCT_ID的计数,并随后获取任何日期范围的计数。
示例脚本:-
我的DB结构和数据如下。

CREATE TABLE time1 (cr_date date , product_id number );

insert into time1 values (to_date ('01-JAN-2022 01:00:00', 'DD_MON-YYYY HH:MI:SS') , 12345);
insert into time1 values (to_date ('01-JAN-2022 01:00:00', 'DD_MON-YYYY HH:MI:SS') , 12346);
insert into time1 values (to_date ('01-JAN-2022 01:00:00', 'DD_MON-YYYY HH:MI:SS') , 12347);
insert into time1 values (to_date ('01-JAN-2022 03:30:00', 'DD_MON-YYYY HH:MI:SS') , 42345);
insert into time1 values (to_date ('01-JAN-2022 03:30:00', 'DD_MON-YYYY HH:MI:SS') , 42346);
insert into time1 values (to_date ('01-JAN-2022 03:35:00', 'DD_MON-YYYY HH:MI:SS') , 42347);
insert into time1 values (to_date ('01-JAN-2022 03:40:00', 'DD_MON-YYYY HH:MI:SS') , 42348);
insert into time1 values (to_date ('01-JAN-2022 10:40:00', 'DD_MON-YYYY HH:MI:SS') , 10348);
insert into time1 values (to_date ('01-JAN-2022 10:42:00', 'DD_MON-YYYY HH:MI:SS') , 10349);
insert into time1 values (to_date ('01-JAN-2022 10:43:00', 'DD_MON-YYYY HH:MI:SS') , 11348);

COMMIT;

输出要求如下:-

| hours   | count |
|:------  |:------|
|00:15:00 |3|
|01:15:00 |0|
|02:15:00 |0|
|03:15:00 |0|
|04:15:00 |4|
|05:15:00 |0|
|06:15:00 |0|
|07:15:00 |0|
|08:15:00 |0|
|09:15:00 |0|
|10:15:00 |0|
|11:15:00 |3|
|..
|...
|23:15:00 |0|
ccrfmcuu

ccrfmcuu1#

你(最初)发布的样本数据几乎是无用的,没有时间成分。
在我的一个表中,有一个datum列,其值如下所示:

SQL> SELECT id, TO_CHAR (datum, 'hh24:mi') hrs FROM obr WHERE rownum <= 10;

        ID HRS
---------- -----
     21547 08:41
     21541 08:17
     21563 09:03
     21614 10:46
     21618 11:01
     21620 11:04
     21622 11:05
     21626 11:10
     21629 11:14
     21642 13:35

10 rows selected.

SQL>

这是一个

  • in fmin CTE creates 24 rows(00:15,01:15,...(23:15)
  • join是在datum上完成的,“四舍五入”到前15分钟的值(无论是在同一小时内,还是在前一小时内-取决于分钟)

所以:

SQL> WITH
  2     fmin
  3     AS
  4        (    SELECT TRUNC (SYSDATE) + (LEVEL - 1) / 24 + INTERVAL '15' MINUTE c_time
  5               FROM DUAL
  6         CONNECT BY LEVEL <= 24)
  7    SELECT TO_CHAR (f.c_time, 'hh24:mi') c_time, COUNT (z.id) cnt
  8      FROM fmin f
  9           LEFT JOIN obr z
 10              ON TO_CHAR (f.c_time, 'hh24:mi') =
 11                 TO_CHAR (
 12                      TRUNC (datum, 'hh24')
 13                    + CASE
 14                         WHEN TO_NUMBER (TO_CHAR (datum, 'mi')) >= 15
 15                         THEN
 16                            INTERVAL '15' MINUTE
 17                         WHEN TO_NUMBER (TO_CHAR (datum, 'mi')) < 15
 18                         THEN
 19                            INTERVAL '-45' MINUTE
 20                      END,
 21                    'hh24:mi')
 22  GROUP BY TO_CHAR (f.c_time, 'hh24:mi')
 23  ORDER BY 1;

结果:

C_TIM        CNT
----- ----------
00:15          0
01:15          0
02:15          0
03:15          0
04:15          0
05:15          0
06:15          0
07:15          2
08:15         10
09:15          1
10:15         14
11:15          6
12:15         10
13:15         38
14:15          5
15:15          0
16:15          0
17:15          0
18:15          0
19:15          0
20:15          0
21:15          0
22:15          0
23:15          0

24 rows selected.

SQL>
watbbzwu

watbbzwu2#

您不会得到基于时间的计数,因为您只在CR_DATE列中存储date
即使您将date转换为timestamp,时间也将始终设置为默认值,即00:00:00.00000012:00:00.000000
为了实现这一点,你必须像下面这样重新创建你的表:

CREATE TABLE time1 (cr_date timestamp, product_id number );

然后,您必须将实际的timestamp插入到表中,如下面的示例所示。

INSERT INTO TIME1 (CR_DATE,PRODUCT_ID) VALUES (to_timestamp('01-01-22 14:32:62.258152','DD-MM-RR HH24:MI:SS.FF'),12345);

这里是to_timestamp的文档。
在此之后,您可以根据您的问题根据时间进行查询。

SELECT TRUNC(CR_DATE,'HH'), count(product_id) 
FROM TIME1 
GROUP BY TRUNC(CR_DATE,'HH');

TRUNC()函数的Here is the documentation
从上述查询中可能得到以下结果。

TRUNC(CR_DATE,'HH')   COUNT(product_id)
------------------- ----------
2022-01-01 09:00:00        748
2022-01-01 16:00:00         24
2022-01-01 17:00:00         12
2022-01-01 22:00:00        737
2022-01-01 23:00:00        182
2022-01-01 20:00:00         16
2022-01-01 21:00:00        293
2022-01-01 22:00:00        610

如果您发现任何问题,请在下面评论以供进一步讨论。

相关问题