You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SQL中如何将字符串格式Unix时间转换为对应日序号

需求实现:逗号分隔Unix时间戳转月中日序号

现有表结构

SQL表Table1包含2个字段:

  • ID:行唯一标识
  • UnixTimes:字符串类型,存储单个或多个逗号分隔的Unix时间戳,示例值:1632862800,1632949200

需求目标

将每行UnixTimes字段内的每个Unix时间戳单独转换为对应月份的日序号,多个转换结果仍用逗号分隔,最终输出格式如下:

1- 21,22
2- 22
3- 22,23
4- 21,22,23
5- 24,25

实现方案

不同数据库的字符串处理、时间转换函数存在差异,以下是主流数据库的实现示例:

MySQL 8.0+ 实现

SELECT 
  CONCAT(t.ID, '- ', GROUP_CONCAT(DAY(FROM_UNIXTIME(CAST(ts.value AS UNSIGNED))) ORDER BY ts.idx SEPARATOR ',')) AS result
FROM Table1 t
JOIN JSON_TABLE(
  CONCAT('["', REPLACE(t.UnixTimes, ',', '","'), '"]'),
  '$[*]' COLUMNS (
    idx FOR ORDINALITY,
    value VARCHAR(20) PATH '$'
  )
) ts
GROUP BY t.ID
ORDER BY t.ID;

如果是MySQL 8.0以下版本不支持JSON_TABLE,可通过辅助数字表配合SUBSTRING_INDEX完成字符串拆分逻辑。

PostgreSQL 实现

SELECT 
  CONCAT(t.ID, '- ', STRING_AGG(EXTRACT(DAY FROM TO_TIMESTAMP(ts::BIGINT))::VARCHAR, ',' ORDER BY ordinality)) AS result
FROM Table1 t,
UNNEST(STRING_TO_ARRAY(t.UnixTimes, ',')) WITH ORDINALITY AS a(ts)
GROUP BY t.ID
ORDER BY t.ID;

核心逻辑梳理

所有数据库的实现都遵循相同的三步逻辑:

  1. 拆分UnixTimes字段的逗号分隔字符串,将每个时间戳拆分为独立行,同时保留原ID关联
  2. 将单个Unix时间戳转换为日期类型,提取对应月份的日序号
  3. 按原ID分组,把提取到的日序号重新拼接为逗号分隔的字符串,按要求格式化输出

内容的提问来源于stack exchange,提问作者Bos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:45:02