SQL从日期范围中选择具有月份名称的表

时间:2012-01-14 10:28:23

标签: sql sql-server sql-server-2008

我有名为:

的表
Posts_August_2011
Posts_September_2011
Posts_October_2011
Posts_November_2011
Posts_December_2011
Posts_January_2012

我想创建UNION表的存储过程,但这不是问题,因为我可以使用动态SQL来粘合它,我的问题是将RANGE的Months和Year Range变为某种列表?然后检查表是否存在,联合它们并返回。

我会声明2个变量@FromDate@Todate as datetime

在给定范围内为每个月提取月份名称和年份的最佳方法是什么。

假设我给它一个范围@FromDate = '2011-10-18 14:16:27.000' and @ToDate = '2012-01-09 14:16:27.000',有人可以建议如何提取月份和年份。

DECLARE @SqlToExecute as nvarchar(MAX);

使用dinamyc SQL是可以接受的,它可以在while循环中检查表的存在 将范围内的每个表的字符串粘贴到字符串:

@SqlToExecute += 'SELECT * FROM Posts_' + extractedMonthName + '_' + extractedYear + ' UNION ALL ';

3 个答案:

答案 0 :(得分:2)

此问题是由错误的数据库设计引起的。您需要将所有这些表中的行存储在一个Postsdate字段中,以指定月份和年份。

要获取表Posts_%的名称和从名称中提取的日期,您可以使用以下代码:

create table Posts_August_2011(i int)
GO
create table Posts_September_2011(i int)
GO

DECLARE @SqlToExecute varchar(max)
DECLARE @FromDate date = '20110801', @ToDate date = '20110809'

SELECT  name PostName, CAST(REPLACE(REPLACE(name,'Posts_','01/'),'_','/') as date) PostDate
INTO #Posts
FROM sys.tables
WHERE name like 'Posts_%'

SET @SqlToExecute=''

SELECT @SqlToExecute += 'SELECT * FROM ' + PostName + ' UNION ALL '
FROM #Posts
WHERE PostDate>=@FromDate
      AND PostDate<@ToDate

SELECT SUBSTRING(@SqlToExecute,1, LEN(@SqlToExecute)-10)

DROP TABLE #Posts
DROP TABLE Posts_August_2011
DROP TABLE Posts_September_2011

sys. tables是系统目录视图,它为当前数据库中的每个表对象返回一行。

答案 1 :(得分:0)

您可以使用DATENAME(month,date)YEAR(date)来构建您的月份和年份。

最简单的方法是创建一个具有年/月组合并过滤日期范围的小型查找表,然后循环结果并构建查询并执行。

稍后您可以查看将该表分区为每月分区,如果表的大小是使您将它们拆分的原因。

答案 2 :(得分:0)

是否可以将这些内容放在一个包含发布日期的[Post]表中?如果需要,可以对它们进行分区吗?