Hola de nuevo SirSocket.
Para rellenar con ceros puedes hacerlo de muchas formas, lamentablemente SQL Server no cuenta con una función LPAD, pero una forma sería hací:
Código SQL:
Ver originalDECLARE @mes SMALLINT
SET @mes = 1
SELECT RIGHT('0' + CAST(@mes AS VARCHAR(2)), 2) mes
SET @mes = 10
SELECT RIGHT('0' + CAST(@mes AS VARCHAR(2)), 2) mes
Por otro lado, pasaste por alto las observaciones que te hice en el primer post. en el WHERE no puedes comparar dos cadenas utilizando >= y <=. Al poner esto
Código:
Convert(Varchar,ano) + Convert(Varchar,mes) + Convert(Varchar,dia)
estas sumando (concatenando) cadenas, por lo tanto
NUNCA VAS A PODER COMPARAR RANGOS DE FECHAS
el resultado de tu concatenación tendrías que convertirlo a tipo datetime, para poder hacer las comparaciones. Checa este script
Código SQL:
Ver originalDECLARE @movimientos TABLE (anio SMALLINT, mes SMALLINT, dia SMALLINT)
INSERT INTO @movimientos VALUES (2009, 12, 31)
INSERT INTO @movimientos VALUES (2010, 6, 28)
INSERT INTO @movimientos VALUES (2011, 1, 1)
SELECT
CAST(CAST(anio AS VARCHAR(4)) +
RIGHT('0' + CAST(mes AS VARCHAR(2)), 2) +
RIGHT('0' + CAST(dia AS VARCHAR(2)), 2) AS datetime) fecha
FROM @movimientos
WHERE
CAST(CAST(anio AS VARCHAR(4)) +
RIGHT('0' + CAST(mes AS VARCHAR(2)), 2) +
RIGHT('0' + CAST(dia AS VARCHAR(2)), 2) AS datetime) >= '20100101' AND
CAST(CAST(anio AS VARCHAR(4)) +
RIGHT('0' + CAST(mes AS VARCHAR(2)), 2) +
RIGHT('0' + CAST(dia AS VARCHAR(2)), 2) AS datetime) <= '20101231'
El resultado sería sólo el segundo registro (si observas un poco es la fecha de dices te trae problemas, con el mes junio (6)) el primer registro y tercero no se muestras pues no forman parte del rango de fechas.
Saludos
Leo.