LOCAL dIncDate, aDateRange[1,2], cDateToStick, cMonthPart SELECT MIN(DATE(val(cYear),val(cMonth),1)) as dmin, ; MAX(DATE(val(cYear),val(cMonth),1)) as dMax ; FROM InputTable ; INTO ARRAY aDateRange && Save min and max 1st of month in array SELECT 0 CREATE CURSOR tblPeriods ( cYearMonth C(6), ; cYear C(4), ; cMonth C(2), ; cQuarter C(2) ) dIncDate = aDateRange[1,1] && Start at first month DO WHILE dIncDate <= aDateRange[1,2] && For each month through the last cDateToStick = DTOS(dIncDate) && Convert to YYYYMMDD cMonthPart = SUBST(cDateToStick,5,2) && Snag MM INSERT INTO tblPeriods VALUES ( cDateToStick, ; cDateToStick, ; cMonthPart, ; 'Q' + TRANSFORM(CEILING(VAL(cMonthPart)/3)) ) dIncDate = GOMONTH(dIncDate,1) && next month ENDDO