【问题标题】:Group by Hour for Epoch time按纪元时间分组
【发布时间】:2021-11-25 15:35:27
【问题描述】:

我需要按小时分组以获得转换的纪元时间,这是我所做的,但它仍然按天分组。有人可以支持吗?

 select count (*) as "Total",to_char(trunc(to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME),'DD/MM/YYYY HH24') as "Day"
from Records
where ID=35 and (INSERTION_TIME/86400)+ to_date('01-01-1970 00:00:00','dd-mm-yyyy HH24:MI:SS') >=sysdate - 4
group by trunc(to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME)
order by trunc(to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME)

【问题讨论】:

  • 可能更安全的是首先将 epoch 列转换为 Oracle DATEthan 组。
  • 删除多余的trunc,这会删除那个小时部分。在尝试使用 GROUP BY 之前,您可以通过查看未分组的表达式来看到这一点。

标签: sql oracle epoch


【解决方案1】:

您可以摆脱大部分算术,只需使用:

SELECT COUNT(*) as "Total",
       TO_CHAR(
         TRUNC(DATE '1970-01-01' + INTERVAL '1' SECOND * INSERTION_TIME, 'HH'),
         'DD/MM/YYYY HH24'
       ) as "Day"
FROM   Records
WHERE  ID=35
AND    DATE '1970-01-01' + INTERVAL '1' SECOND * INSERTION_TIME >=sysdate - 4
GROUP BY
       TRUNC(DATE '1970-01-01' + INTERVAL '1' SECOND * INSERTION_TIME, 'HH')
ORDER BY
       TRUNC(DATE '1970-01-01' + INTERVAL '1' SECOND * INSERTION_TIME, 'HH')

注意:纪元时间通常为 1970-01-01 00:00:00 UTC。如果您的会话时区不是 UTC,那么您可能会错误地计算纪元时间并希望使用时间戳:

SELECT COUNT(*) as "Total",
       TO_CHAR(
         TRUNC(
           TIMESTAMP '1970-01-01 00:00:00 UTC' + INTERVAL '1' SECOND * INSERTION_TIME,
           'HH'
         ),
         'DD/MM/YYYY HH24'
       ) as "Day"
FROM   Records
WHERE  ID=35
AND    TIMESTAMP '1970-01-01 00:00:00 UTC' + INTERVAL '1' SECOND * INSERTION_TIME
         >=SYSTIMESTAMP - INTERVAL '4' DAY
GROUP BY
       TRUNC(
         TIMESTAMP '1970-01-01 00:00:00 UTC' + INTERVAL '1' SECOND * INSERTION_TIME,
         'HH'
       )
ORDER BY
       TRUNC(
         TIMESTAMP '1970-01-01 00:00:00 UTC' + INTERVAL '1' SECOND * INSERTION_TIME,
         'HH'
       )

【讨论】:

  • SYSDATE 在数据库服务器操作系统时区中返回,因此“如果您的会话时区不是 UTC 那么...”应该是“如果那么您的数据库服务器操作系统时区不是 UTC..."
【解决方案2】:

注意trunc 在你的表情上的行为。它删除了小时部分。

使用 dbfiddle.uk 的测试用例:

Test case

未分组的 SQL,在选择列表中有额外的表达式:

select to_char(trunc(to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME),'DD/MM/YYYY HH24') as "Day"
     , to_char(     (to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME),'DD/MM/YYYY HH24') as "Day"
  from Records
 where ID = 35 and (INSERTION_TIME/86400) + to_date('01-01-1970 00:00:00','dd-mm-yyyy HH24:MI:SS') >= sysdate - 4
   AND rownum < 6
 order by      (to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME)
;

未分组的结果:

现在添加GROUP BY

select COUNT(*) AS n
     , to_char(trunc(to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME),'DD/MM/YYYY HH24') as "Day"
     , to_char(     (to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME),'DD/MM/YYYY HH24') as "Day"
  from Records
 where ID = 35 and (INSERTION_TIME/86400) + to_date('01-01-1970 00:00:00','dd-mm-yyyy HH24:MI:SS') >= sysdate - 4
 group by      (to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME)
 order by      (to_date('19700101 00', 'YYYYMMDD HH24') + ( 1 / 24 / 60 / 60 ) * INSERTION_TIME)
;

分组结果:

创建测试用例:

CREATE TABLE Records (
    id              int
  , insertion_time  int
);

INSERT INTO Records VALUES (35, 4011134567);
INSERT INTO Records VALUES (35, 4011134567);
INSERT INTO Records VALUES (35, 4011134567);
INSERT INTO Records VALUES (35, 4011134567);

【讨论】:

  • 感谢您的澄清;但是,当我这样做时,它会返回带有分组的记录,如下所示:3 03/10/2021 12 2 03/10/2021 12 3 03/10/2021 12 7 03/10/2021 12
  • @AhmedZein 显示您的测试用例。我在我的答案中添加了一个测试用例。如您所见,它的行为符合预期。此类问题的每个问题都应包含一个最小的测试用例,以读者可以直接使用的形式。
  • @AhmedZein 我在您的输出中看不到任何分钟或秒数。有一个 count Ndate hour 结果,然后是相同的其他行。显示您使用的确切 SQL。
  • @AhmedZein 我已将小提琴链接添加到可用于测试的答案的最顶部。
  • 嗨@Jon Armstrong,我使用了你提供的那个,是的,它不显示小时或分钟,但小时“12”是重复的,没有分组,这就是我的意思。我需要将所有记录 3 + 2 + 3 + 7 分组为一条记录,小时为“12”。
猜你喜欢
  • 1970-01-01
  • 2017-10-13
  • 2017-12-22
  • 2021-11-22
  • 2019-04-21
  • 2011-04-27
  • 1970-01-01
  • 2013-04-24
  • 2020-05-05
相关资源
最近更新 更多