提问人:jot 提问时间:10/26/2023 更新时间:10/26/2023 访问量:30
SQL查询返回一个unix时间来表示一天
SQL query to return one unix time to represent a day
问:
我需要通知用户发生警报的日期。
我的数据库中有一个alerts_table,它存储了 unixtime 和在此期间发生的警报。
select DISTINCT unixtime from alerttable; // returns all alerts
问题是我每天有数千个警报发生,我只希望我的查询返回一个代表每天的 UNIX 时间 ,这样我就可以告诉用户他是否在特定日期收到警报。
然后我可以将 unix 时间转换为 Days 并向用户显示 (例如:您在 2023 年 11 月 11 日、2023 年 12 月 11 日等收到警报)
谢谢!!
答:
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(或者如果我们愿意,也可以选择日期本身)。TRUNC
GROUP BY
我们必须决定选择哪个 unix 时间。我选择了每天使用的第一个。MIN
该子句从最早的一天开始对结果进行排序。ORDER BY
我们可以在这个示例小提琴上尝试这个解决方案
0赞
MT0
10/26/2023
#2
将 unixtime 转换为(在 UTC 时区中,因为 unix 时间是从 1970-01-01 00:00:00 UTC 开始计算的),然后吃到一天的开始:TIMESTAMP WITH TIME ZONE
TRUNC
如果您在几秒钟内,则: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)
评论