如何用SQL查询返回每日唯一Unix时间以展示告警发生日期?
获取每日唯一告警日期对应的Unix时间
要实现按日期聚合,得到每个告警日期对应的唯一Unix时间戳,核心是先把Unix时间转换为日期格式,再按日期分组,取每组内任意一个时间戳即可(比如最小或最大的,不影响最终日期展示)。以下是主流数据库的实现方案:
MySQL
SELECT MIN(unixtime) AS daily_unixtime, FROM_UNIXTIME(unixtime, '%Y/%m/%d') AS alert_date FROM alerts_table GROUP BY FROM_UNIXTIME(unixtime, '%Y/%m/%d');
FROM_UNIXTIME(unixtime, '%Y/%m/%d')将Unix时间戳转换为YYYY/MM/DD格式的日期字符串- 按转换后的日期分组,用
MIN(unixtime)提取该日期下最早的Unix时间戳作为唯一标识
PostgreSQL
SELECT MIN(unixtime) AS daily_unixtime, TO_CHAR(TO_TIMESTAMP(unixtime), 'YYYY/MM/DD') AS alert_date FROM alerts_table GROUP BY TO_CHAR(TO_TIMESTAMP(unixtime), 'YYYY/MM/DD');
TO_TIMESTAMP(unixtime)把Unix时间戳转为PostgreSQL时间类型,再用TO_CHAR格式化指定日期格式- 分组后取该日期下的最小Unix时间戳,后续可直接用这个时间戳转换为日期展示给用户
SQL Server
SELECT MIN(unixtime) AS daily_unixtime, FORMAT(DATEADD(SECOND, unixtime, '1970-01-01'), 'yyyy/MM/dd') AS alert_date FROM alerts_table GROUP BY FORMAT(DATEADD(SECOND, unixtime, '1970-01-01'), 'yyyy/MM/dd');
DATEADD(SECOND, unixtime, '1970-01-01')将Unix时间戳转为SQL Server的datetime类型,FORMAT负责格式化日期格式- 按日期分组后提取唯一时间戳,满足后续展示需求
如果只需要每个日期对应的唯一Unix时间戳,不需要提前生成日期字符串,也可以简化分组条件(比如直接按转换后的日期类型分组),最终得到的时间戳都能正确转换为对应的日期。
内容的提问来源于stack exchange,提问作者jot
相关产品推荐
相关产品推荐

