基于表名日期从SQL多表提取指定范围数据的实现方法
如何按表名日期提取最近12个/3个月的SQL表数据
完全可行,以下是具体实现步骤,以SQL Server为例(其他数据库逻辑可类比调整):
1. 先筛选符合条件的目标表
首先通过系统视图获取所有格式为exampledata_yyyy-mm-dd的表,并提取表名中的日期:
SELECT name AS table_name, CAST(RIGHT(name, 10) AS DATE) AS table_date FROM sys.tables WHERE name LIKE 'exampledata_%' ORDER BY table_date DESC
2. 生成动态SQL查询目标数据
因为表名是动态的,需要用动态SQL拼接UNION ALL来查询所有符合条件的表。
方式一:提取近3个月内的表
DECLARE @sql NVARCHAR(MAX) = '' -- 拼接所有近3个月表的查询语句 SELECT @sql = @sql + 'SELECT * FROM dbo.' + QUOTENAME(name) + ' UNION ALL ' FROM ( SELECT name FROM sys.tables WHERE name LIKE 'exampledata_%' AND CAST(RIGHT(name, 10) AS DATE) >= DATEADD(MONTH, -3, GETDATE()) ) AS recent_tables -- 移除末尾多余的UNION ALL IF LEN(@sql) > 0 SET @sql = LEFT(@sql, LEN(@sql) - 10) -- 执行动态SQL EXEC sp_executesql @sql
方式二:提取最近12个表
DECLARE @sql NVARCHAR(MAX) = '' -- 拼接最近12个表的查询语句 SELECT @sql = @sql + 'SELECT * FROM dbo.' + QUOTENAME(name) + ' UNION ALL ' FROM ( SELECT name FROM ( SELECT name, ROW_NUMBER() OVER(ORDER BY CAST(RIGHT(name, 10) AS DATE) DESC) AS row_num FROM sys.tables WHERE name LIKE 'exampledata_%' ) AS ranked_tables WHERE row_num <= 12 ) AS top_tables -- 移除末尾多余的UNION ALL IF LEN(@sql) > 0 SET @sql = LEFT(@sql, LEN(@sql) - 10) -- 执行动态SQL EXEC sp_executesql @sql
注意事项
- 确保所有目标表的结构完全一致(列名、数据类型、顺序都要匹配),否则
UNION ALL会报错。 - 如果是其他数据库(如MySQL、PostgreSQL),需要替换系统视图和日期函数:
- MySQL用
information_schema.tables,日期计算用DATE_SUB(CURDATE(), INTERVAL 3 MONTH),提取日期用SUBSTRING(table_name, LENGTH('exampledata_') + 1) - PostgreSQL用
information_schema.tables,日期计算用CURRENT_DATE - INTERVAL '3 months',提取日期用RIGHT(table_name, 10)::DATE
- MySQL用
内容的提问来源于stack exchange,提问作者Matthew Delos Santos
相关产品推荐
相关产品推荐

