SQL查询返回一个unix时间来表示一天

SQL query to return one unix time to represent a day

提问人:jot 提问时间:10/26/2023 更新时间:10/26/2023 访问量:30

问:

我需要通知用户发生警报的日期。

我的数据库中有一个alerts_table,它存储了 unixtime 和在此期间发生的警报。

select DISTINCT unixtime from alerttable; // returns all alerts 

问题是我每天有数千个警报发生,我只希望我的查询返回一个代表每天的 UNIX 时间 ,这样我就可以告诉用户他是否在特定日期收到警报。

然后我可以将 unix 时间转换为 Days 并向用户显示 (例如:您在 2023 年 11 月 11 日、2023 年 12 月 11 日等收到警报)

谢谢!!

(SQL 甲骨文11g

评论


答:

1赞 Jonas Metzler 10/26/2023 #1

我不确定这是否是最好的方法,但它有效:

SELECT 
  MIN(unixTime) AS unixtime, 
  TRUNC(TO_DATE( '1970-01-01', 'YYYY-MM-DD' ) 
        + NUMTODSINTERVAL(unixTime, 'SECOND' )) AS "day"
FROM yourtable
GROUP BY 
  TRUNC(TO_DATE( '1970-01-01', 'YYYY-MM-DD' ) 
        + NUMTODSINTERVAL(unixTime, 'SECOND' ))
ORDER BY 1;

因此,我们使用该函数(请参阅文档)来从 unixtime 中获取秒数。NUMTODSINTERVAL

由于 unix 时间的定义是“开始”的,我们可以将秒添加到此日期,并将从 unixtime 值中获取日期。1970-01-01

现在我们习惯于去掉确切的时间,只关注日期。因此,我们只能选择日期,并且每天只选择一个 unixtime(或者如果我们愿意,也可以选择日期本身)。TRUNCGROUP BY

我们必须决定选择哪个 unix 时间。我选择了每天使用的第一个。MIN

该子句从最早的一天开始对结果进行排序。ORDER BY

我们可以在这个示例小提琴上尝试这个解决方案

0赞 MT0 10/26/2023 #2

将 unixtime 转换为(在 UTC 时区中,因为 unix 时间是从 1970-01-01 00:00:00 UTC 开始计算的),然后吃到一天的开始:TIMESTAMP WITH TIME ZONETRUNC

如果您在几秒钟内,则:unixtime

SELECT TRUNC(TIMESTAMP '1970-01-01 00:00:00 UTC' + INTERVAL '1' SECOND * unixtime)
         AS day
FROM   alerttable
GROUP BY
       TRUNC(TIMESTAMP '1970-01-01 00:00:00 UTC' + INTERVAL '1' SECOND * unixtime)

如果以毫秒为单位,则:unixtime

SELECT TRUNC(TIMESTAMP '1970-01-01 00:00:00 UTC' + INTERVAL '0.001' SECOND * unixtime)
         AS day
FROM   alerttable
GROUP BY
       TRUNC(TIMESTAMP '1970-01-01 00:00:00 UTC' + INTERVAL '0.001' SECOND * unixtime)