Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

convertir smallint en fecha + select

Estas en el tema de convertir smallint en fecha + select en el foro de SQL Server en Foros del Web. Buenas. Tengo una tabla donde tengo los campos dia,mes y año por separado. Lo que quiero hacer es concatenarlos de manera que me cree un ...
  #1 (permalink)  
Antiguo 05/09/2011, 07:34
 
Fecha de Ingreso: septiembre-2010
Mensajes: 58
Antigüedad: 13 años, 7 meses
Puntos: 0
convertir smallint en fecha + select

Buenas.

Tengo una tabla donde tengo los campos dia,mes y año por separado.

Lo que quiero hacer es concatenarlos de manera que me cree un campo de tipo fecha para poder comparalos con unas fechas que el usuario me entra.

Código:
DECLARE  @DateTime NVARCHAR

select @DateTime = (Convert(Varchar,ano) + Convert(Varchar,mes) + Convert(Varchar,dia) )
from movimentos
where @DateTime >= '20000101'and
      @DateTime <= '20110101'
Tengo hecho esto y aunque no me manda error, no me muestra ningún resultado y eso que la tabla tiene registros para esas fechas
  #2 (permalink)  
Antiguo 05/09/2011, 08:28
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: convertir smallint en fecha + select

Hola SirSocket:

Hay varias cosas que hay que tomar en cuenta. Primero, dices que tienes tus campos año, mes y día en columnas separadas, pero no nos dices de qué tipo de datos son las columnas, varchar, entero y otro tipo.

Segundo, deberías comentarnos cómo estás almacenando los meses y días de un dígito, por ejemplo Enero, lo estás almacenando como '01' o como 1.

Tercero en tu declaración de la variable @DateTime no estás especificando una longitud, por lo tanto solo te va a almacenar un caracter, para almacenar la fecha completa debería ser de al menos 8 caracteres.

Cuarto, para comparar fechas tal y como lo estás poniendo, es decir comparándola contra una cadena con el formato ANSI el primer campo debe ser tipo fecha, es decir comparas datetime contra cadena. si comparas cadena contra cadena estarías comparando ALFABETICAMENTE.

te dejo un script de cómo sería si tus campos son varchar, si nos manejas con un tipo de dato distinto es cuestión de que hagas las adecuaciones necesarias.

Código SQL:
Ver original
  1. DECLARE  @DateTime nvarchar(10)
  2. DECLARE @movimientos TABLE (anio VARCHAR(4), mes VARCHAR(2), dia VARCHAR(2))
  3. INSERT INTO @movimientos VALUES ('1999', '12', '31')
  4. INSERT INTO @movimientos VALUES ('2001', '01', '01')
  5. INSERT INTO @movimientos VALUES ('2003', '01', '01')
  6. INSERT INTO @movimientos VALUES ('2005', '01', '01')
  7. INSERT INTO @movimientos VALUES ('2007', '01', '01')
  8. INSERT INTO @movimientos VALUES ('2009', '01', '01')
  9. INSERT INTO @movimientos VALUES ('2011', '01', '01')
  10. INSERT INTO @movimientos VALUES ('2011', '01', '02')
  11.  
  12. SELECT CONVERT(datetime, anio + mes + dia) fecha
  13. FROM @movimientos
  14. WHERE
  15. CONVERT(datetime, anio + mes + dia) >= '20000101' AND
  16. CONVERT(datetime, anio + mes + dia) <= '20110101'
  17.  
  18. /*
  19. fecha
  20. -----------------------
  21. 2001-01-01 00:00:00.000
  22. 2003-01-01 00:00:00.000
  23. 2005-01-01 00:00:00.000
  24. 2007-01-01 00:00:00.000
  25. 2009-01-01 00:00:00.000
  26. 2011-01-01 00:00:00.000
  27. */

Saludos
Leo.
  #3 (permalink)  
Antiguo 05/09/2011, 08:54
 
Fecha de Ingreso: septiembre-2010
Mensajes: 58
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: convertir smallint en fecha + select

Perdona me olvide.

los campos son de tipo smallint

y el ejemplo que me pones no me sirve porque me realiza la suma de los campos

Código SQL:
Ver original
  1. CONVERT(datetime, anio + mes + dia)

pero me has dado un idea y ya he conseguido que funcione

Código SQL:
Ver original
  1. SELECT CONVERT(VARCHAR(4),ano) + CONVERT(VARCHAR(2),mes) + CONVERT(VARCHAR(2),dia) , valor, natureza
  2. FROM movimentos
  3. WHERE CONVERT(VARCHAR(4),ano) + CONVERT(VARCHAR(2),mes) + CONVERT(VARCHAR(2),dia)   >= '20090101' AND
  4.       CONVERT(VARCHAR(4),ano) + CONVERT(VARCHAR(2),mes) + CONVERT(VARCHAR(2),dia)   <= '20111230'
  #4 (permalink)  
Antiguo 05/09/2011, 09:13
 
Fecha de Ingreso: septiembre-2010
Mensajes: 58
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: convertir smallint en fecha + select

Perdón

parece que me equivoque porque no funciona del todo bien esta ultima sentencia porque tengo fechas que no me las esta cogiendo y las tendria que coger
  #5 (permalink)  
Antiguo 05/09/2011, 09:27
 
Fecha de Ingreso: septiembre-2010
Mensajes: 58
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: convertir smallint en fecha + select

MIra no me esta cogiendo una transacción que tiene por fecha 2010628

porque me las convierte así, al ser el mes el sexto pone un 6 no un 06 sabes como añadir un 0 delante del 6 en el convert?


Código SQL:
Ver original
  1. SELECT CONVERT(VARCHAR,ano) + CONVERT(VARCHAR,mes) + CONVERT(VARCHAR,dia)
  2.     FROM movimentos
  3.     WHERE CONVERT(VARCHAR,ano) + CONVERT(VARCHAR,mes) + CONVERT(VARCHAR,dia)   >= '20100101' AND
  4.           CONVERT(VARCHAR,ano) + CONVERT(VARCHAR,mes) + CONVERT(VARCHAR,dia)   <= '20101231'
  #6 (permalink)  
Antiguo 05/09/2011, 15:18
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: convertir smallint en fecha + select

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 original
  1. DECLARE @mes SMALLINT
  2. SET @mes = 1
  3. SELECT RIGHT('0' + CAST(@mes AS VARCHAR(2)), 2) mes
  4. SET @mes = 10
  5. 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 original
  1. DECLARE @movimientos TABLE (anio SMALLINT, mes SMALLINT, dia SMALLINT)
  2. INSERT INTO @movimientos VALUES (2009, 12, 31)
  3. INSERT INTO @movimientos VALUES (2010, 6, 28)
  4. INSERT INTO @movimientos VALUES (2011, 1, 1)
  5. SELECT
  6. CAST(CAST(anio AS VARCHAR(4)) +
  7. RIGHT('0' + CAST(mes AS VARCHAR(2)), 2) +
  8. RIGHT('0' + CAST(dia AS VARCHAR(2)), 2) AS datetime) fecha
  9. FROM @movimientos
  10. WHERE
  11. CAST(CAST(anio AS VARCHAR(4)) +
  12. RIGHT('0' + CAST(mes AS VARCHAR(2)), 2) +
  13. RIGHT('0' + CAST(dia AS VARCHAR(2)), 2) AS datetime) >= '20100101' AND
  14. CAST(CAST(anio AS VARCHAR(4)) +
  15. RIGHT('0' + CAST(mes AS VARCHAR(2)), 2) +
  16. 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.
  #7 (permalink)  
Antiguo 06/09/2011, 00:32
 
Fecha de Ingreso: septiembre-2010
Mensajes: 58
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: convertir smallint en fecha + select

Muchas gracias funciona perfectamente.

Última edición por SirSocket; 06/09/2011 a las 03:32

Etiquetas: fecha, registros, select, tabla, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:13.