SQL - Calcular edad

 
Vista:
sin imagen de perfil

Calcular edad

Publicado por EA (2 intervenciones) el 22/01/2015 21:29:33
Hola buenos días,
Estoy realizando una consulta en SQL para calcular la edad de los cliente en una base de datos, los registros están divididos en Día, Mes y año, no puedo modificarlo de la tabla original para que me quede un solo campo de estos mismo campos necesito saber la edad del cliente, pero al mismo tiempo hay varios campos que tienen 0 en su contenido ya sea en el día, el Mes o el año, esto es lo que llevo hasta el momento

SELECT
A.DDDNAC,
A.DMMNAC,
A.DAANAC,
datediff(YEAR,
convert(datetime, convert(varchar(4),A.DAANAC)+'/'+
convert(varchar(2),REPLICATE('0',2-LEN(A.DMMNAC))
+ convert (Varchar(2), a.DMMNAC))+'/'+
convert (varchar(2),REPLICATE('0',2-LEN(A.DDDNAC))
+ convert(varchar(2),a.DDDNAC)),111),getdate()) as edad
FROM SMG3 A

al momento de corres esta consulta me aparece el siguiente error:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias Islas
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Calcular edad

Publicado por Isaias Islas (1921 intervenciones) el 22/01/2015 21:33:07
Si no tienes AÑO, entonces es como tratar de intentar adivinar, cuando se formo la tierra.

En tu WHERE debes excluir todos aquellos registros que NO cumplen con el contenido

¿Qué base de datos usas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Calcular edad

Publicado por EA (2 intervenciones) el 22/01/2015 21:37:52
Tengo el año de nacimiento, pero en algunos casos ese campo esta es cero esos casos no me preocupan porque son pocos pero si me interesa hacer el calculo de los que si tienen los campos completos, ya que son más los registros que están completos que los que no.
Estoy trabajando con SQL Server 2008
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Calcular edad

Publicado por leonardo_josue (1173 intervenciones) el 23/01/2015 17:17:44
Hola EA:

Hay alguna razón en especial por la que no puedas cambiar la estructura de tus tablas??? si algo está mal, pues lo mejor es corregirlo de fondo, no simplemente hacer "parches", la información tal como la tienes es a final de cuentas un montón de basura...

Pero bueno, esa cuestión no nos compete en este caso, te comento que la idea que tienes es correcta, es decir, tomar los tres campos por separado para convertirlo en una fecha y después utilizar la función datediff, sin embargo NO ESTÁS VALIDANDO QUE LOS TRES CAMPOS TE FORMEN UNA FECHA VÁLIDA, este es justamente el sentido del error que te está marcando...

Más que hacer las condiciones en el WHERE, te recomiendo que programes una función específica para validar antes la fecha y que consideres lo siguiente:

1. Que el año CONTENGA SOLO NUMEROS y que al converirlo a numérico, el valor sea al menos mayor o igual a 1900 y menor o igual al año actual. Esto te dará opción de tener clientes de más de 100 años y recién nacidos.

2. Que el mes contenga sólo números y que estos sean estén entre 1 y 12 o 01-12.

3. Que el mes contenga sólo números y que debe estar en un rango específico de acuerdo al mes.

Si el mes es 1, 3, 5, 7, 8, 10 o 12, entonces el día debe estar entre 1-31
Si el mes es 4, 5, 9 u 11, entonces el mes debe estar entre 1-30
Si el mes es 2, entonces primero debes verificar si el AÑO es bisiesto
Si el año es bisiesto, entonces el día debe estar entre 1-29
Si el año no es bisiesto, entonces el mes debe estar entre 1-28

Ahora bien, hay otra forma más "simple" de verificar esto, y es simplemente utilizar la función ISDATE, la cual comprueba si una cadena es una fecha válida o no:

https://msdn.microsoft.com/es-MX/library/ms187347.aspx

Utiliza esta función ANTES DE TRATAR DE HACER EL CONVERT a datetime... el problema con la función ISDATE, es que en realidad valida sólo que la cadena que formas sea una fecha, pero cualquier fecha, es decir, si en tu tabla tienes una fecha que indique una "fecha de nacimiento" del 12/10/1492, esto es una fecha válida para la función ISDATE, pero eso indicaría que tienes como cliente a alguien que nació el día en que se descubrió América.


insisto, es mejor programar una función que tratar de hacer esto directamente en el SQL.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar