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

基于表名日期从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

内容的提问来源于stack exchange,提问作者Matthew Delos Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:39:59