SQL无date、timestamp列时如何获取最近一年的数据
无日期时间列场景下提取表中近一年数据的实现方案
借助自增/有序主键筛选
如果表存在自增整数主键、或者雪花ID这类按写入顺序递增的有序ID,可通过ID的有序性定位时间边界:- 若为带时间戳的雪花ID,可直接解析ID内置的时间字段完成精确筛选,MySQL场景示例如下:
SELECT * FROM target_table WHERE FROM_UNIXTIME((snowflake_id >> 22) + 1288834974657 / 1000) >= DATE_SUB(NOW(), INTERVAL 1 YEAR); - 若为普通自增ID,可先通过关联带时间列的关联业务表、或者按已知的历史数据增量估算得到一年前对应的临界ID,再做范围查询:
SELECT * FROM target_table WHERE id >= 估算得到的临界ID;
- 若为带时间戳的雪花ID,可直接解析ID内置的时间字段完成精确筛选,MySQL场景示例如下:
借助业务字段解析筛选
如果表中存在订单号、工单编号、流水号这类内置生成时间的业务字段,可直接解析编码中的时间片段完成筛选。例如业务单号前8位为YYYYMMDD格式的生成日期,示例如下:SELECT * FROM target_table WHERE LEFT(biz_no,8) >= DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 YEAR),'%Y%m%d');借助数据库隐式字段筛选
多数关系型数据库都内置了记录数据写入/修改状态的隐式字段,可通过这类字段映射到时间维度筛选:- Oracle场景可借助
ORA_ROWSCN伪列映射时间:SELECT * FROM target_table WHERE SCN_TO_TIMESTAMP(ORA_ROWSCN) >= ADD_MONTHS(SYSDATE,-12); - PostgreSQL场景可借助
xmin系统列结合事务提交时间映射筛选 - MySQL场景可先查询
INFORMATION_SCHEMA.TABLES的UPDATE_TIME配合表分区规则(若表按写入顺序分区)筛选对应分区的数据
- Oracle场景可借助
精度补充说明
除解析ID/业务单号内置时间的方案外,其余方案均为近似匹配,若需要严格的时间范围筛选,必须在表中新增日期时间列,后续写入数据时同步填充时间值,历史数据可通过关联其他带时间维度的业务表回溯补全
内容的提问来源于stack exchange,提问作者swetha
相关产品推荐
相关产品推荐

