2015-01-21 4 views
0

У меня есть таблица размеров, в которой мне нужно будет отображать YYYYMM в течение следующих 50 лет. Я уверен, что есть способ сделать это без ручного ввода данных, но я не уверен, что это подходящий способ.Сценарий для заполнения таблицы измерений даты на следующие 50 лет

Моя таблица имеет

An ID which is an int that will display YYYYMM 
the month that will be a varchar(2) to display MM 
and the year that will be a varchar(4) to display YYYY 

ли кто-нибудь сможет помочь мне с этим? Мне никогда не приходилось писать сценарий раньше, и примеры, которые я видел в Интернете, больше показывают типы данных datetime.

Я бы также хотел бы начать несколько лет назад для уже существующих данных. Скажем 2010 - 2070

+0

Здесь будет полезен стол подсчета. Прочтите следующую статью (нижняя часть относится к вашему вопросу). http://www.sqlservercentral.com/articles/T-SQL/62867/ – DB101

+0

http://sqlperformance.com/generate-a-set-1 http://sqlperformance.com/generate-a-set-2 http : //sqlperformance.com/generate-a-set-3 –

ответ

1

Это работает для меня

DECLARE @t TABLE 
    (
     id INT , 
     m VARCHAR(2) , 
     y VARCHAR(4) 
    ) 

DECLARE @i INT = 1 
DECLARE @today DATE = '20150121' 
DECLARE @endDate DATE = DATEADD(YEAR, 50, @today) 

WHILE @today <= @endDate 
    BEGIN 

     INSERT INTO @t 
       (id , 
        m , 
        y 
       ) 
     VALUES (CAST(LEFT(CONVERT(CHAR(8), @today, 112), 6) AS INT) , 
        SUBSTRING(CONVERT(CHAR(8), @today, 112), 5, 2) , 
        LEFT(CONVERT(CHAR(8), @today, 112), 4) 
       ) 

     SET @today = DATEADD(MONTH, 1, @today) 
    END 

Выход:

id m y 
201501 01 2015 
201502 02 2015 
201503 03 2015 
201504 04 2015 
201505 05 2015 
201506 06 2015 
201507 07 2015 
201508 08 2015 
201509 09 2015 
201510 10 2015 
201511 11 2015 
201512 12 2015 
201601 01 2016 
201602 02 2016 
201603 03 2016 
     . . . 
206410 10 2064 
206411 11 2064 
206412 12 2064 
206501 01 2065 
+0

Спасибо за помощь. Я действительно начал выяснять это, прежде чем я увидел ваш ответ. Это было очень близко к тому, как я это сделал. – scapegoat17

0

Я буду делать это, используя таблицу индикаторную с stacked cte. Попробуйте это

declare @start_year varchar(4)='2010',@end_year varchar(4)='2070' 

;WITH e1(n) AS 
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 
), -- 10 
e2(n) AS (SELECT 1 FROM e1 CROSS JOIN e1 AS b), -- 10*10 
e3(n) AS (SELECT 1 FROM e2 CROSS JOIN e2 AS b), -- 100*100 
e4(n) AS (SELECT 1 FROM e3 CROSS JOIN (SELECT TOP 5 n FROM e1) AS b) -- 5*10000 
,e5 as (SELECT Dateadd(Month, Row_number()OVER (
            ORDER BY n) - 1, Cast(@start_year + '-01-01' AS DATE)) AS dates 
     FROM e4) 

     SELECT Id=LEFT(CONVERT(CHAR(8), dates, 112), 6), 
       [Month]=Month(dates), 
       [Year]=Year(dates) 
     FROM e5 
     WHERE Year(dates) <= @end_year 
Смежные вопросы