<code>**YEAR(now()) - YEAR(birthdate)**</code> no está comparando el mes y día actual con el de **birthdate ** para saber si ya cumplió, ...

Pregunta de la clase:
Su majestad el SELECT
Martin Suarez

Martin Suarez

Pregunta
studenthace 5 años

**YEAR(now()) - YEAR(birthdate)**
no está comparando el mes y día actual con el de **birthdate ** para saber si ya cumplió, o si restarle 1 a la edad. Esa condición hay que insertarla en el mismo SELECT ?

6 respuestas
para escribir tu comentario
    Ariana Gabriela Carvajal Kerch

    Ariana Gabriela Carvajal Kerch

    studenthace 5 años

    Hola

    Juan Castro

    Juan Castro

    teacherhace 5 años

    Qué bueno que te ayudó. :)

    Recuerda que también puedes estudiar Postgres. En mi opinión y la de muchas otras personas, es la mejor base de datos relacional. Es súmamente poderosa.

    Si te sorprendiste de poder usar condicionales en MySQL, no te imaginas lo que puedes hacer directo con Postgres. :wink:

    :nerd_face: https://platzi.com/clases/postgresql/ :heart_eyes: https://platzi.com/blog/mi-historia-de-amor-con-postgresql/ :sunglasses: https://platzi.com/blog/el-apagon-de-platzi-migramos-de-mysql-a-postgresql/

    David De la Cruz

    David De la Cruz

    studenthace 5 años

    ¡Muchísimas Gracias @juandc!

    Eres un biblioteca andante!, jeje, cuantas cositas nuevas que aprender. Me encanta!

    Se me sigue haciendo la boca agua con cada curso que quiero aprender de platzi, pero poco a poco, que si no, no se centra uno en nada, así que tengo para años de aprendizaje.

    Un abrazo.

    Juan Castro

    Juan Castro

    teacherhace 5 años

    ¡Hola, @japote!

    El condicional que usa @luiscampos solo es un ejemplo rápido-genial del

    case
    y de las funciones
    day
    y
    month
    . Pero, en realidad, como dices, no evalúa todos los casos.

    Para resolverlo hay que tener muy claro el objetivo. Los requisitos de esta consulta son:

    • Listar a todos los clientes
    • Obtener su fecha de cumpleaños
    • Entregar el mensaje "Ya cumplió años este año" cuando el día o mes de el año en que se haga la consulta sean números mayores a los del cumpleaños del cliente
    • Entregar el mensaje "No ha cumplido años este año" cuando el día o mes de el año en que se haga la consulta sean números menores a los del cumpleaños del cliente
    • Entregar el mensaje "¡Feliz cumpleaños!" cuando el día y/o mes de el año en que se haga la consulta sean números iguales a los del cumpleaños del cliente

    Para esto, creo que lo mejor es un condicional

    CASE WHEN
    "múltiple" (no estoy seguro de cuál es el nombre técnico :sweat_s).

    SELECT `name`, `birthday`, CASE birthday WHEN ( month(now()) > month(birthdate) OR day(now()) > day(birthdate) ) THEN 'Ya cumplió años este año' WHEN( month(now()) < month(birthdate) OR day(now()) < day(birthdate) ) THEN 'No ha cumplido años este año' WHEN ( month(now()) = month(birthdate) AND day(now()) = day(birthdate) ) THEN '¡Feliz cumpleaños!' ELSE 'Error. Esto no tiene sentido. Llamen a Batman.' END AS cumplestatus FROM `clients`;

    Aquí puedes estudiar más sobre el "case when múltiple": https://www.plus2net.com/sql_tutorial/sql_case.php. :wink:

    David De la Cruz

    David De la Cruz

    studenthace 5 años

    @luiscampos estaba revisando las sentencias que has escrito, porque no sabía que se podían realizar comparaciones tipo if else en mysql, y me ha gustado aprenderlo, pero he visto que la comparación no es del todo buena, ya que únicamente muestra que ya cumplió años cuando el mes actual es mayor o igual al mes del cumpleaños y el día actual es mayor al día del cumpleaños, por lo que deja fuera muchos días y el mes actual, debido a que AND devolverá true cuando ambos lados de la comparación sea true.

    He probado a realizar la comparación de diferentes formas, pero no doy con la sentencia correcta. @juandc ¿puedes ayudarnos? no creo que sea un problema de las funciones month() o day() ya que veo que funcionan correctamente, y tampoco creo que se solucione con un where, ya que eso lo única que me hace es filtrar el resultado de las tuplas a mostrar, creo que más bien debe ser un problema a la hora de la comparación, ya que debe de tomar en todo su conjunto tanto el mes como el día, y no por separado.

    Jose Luis Campos Bautista

    Jose Luis Campos Bautista

    studenthace 5 años

    Se podría utilizar las funciones mont() y day() para compararlas.

    Para saber quien ya cumplió años, se me ocurre el siguiente querie donde se complementa con la clausula case:

    select name, birthdate, case when month(now()) >= month(birthdate) and day(now()) > day(birthdate) then 'Ya cunplio años' else 'No ha cunpliodo años' end as 'Estus cumple años' from clients;
Curso de SQL y MySQL desde Cero ► Empieza Gratis

Curso de SQL y MySQL desde Cero ► Empieza Gratis

Aprende desde cero SQL, el lenguaje para gestionar y consultar bases de datos relacionales. Elabora tablas, cruza, elimina, modifica y consulta información. Conoce las funciones de MySQL como gestor de base de datos para crear aplicaciones y soluciones tecnológicas efectivas.

Curso de SQL y MySQL desde Cero ► Empieza Gratis
Curso de SQL y MySQL desde Cero ► Empieza Gratis

Curso de SQL y MySQL desde Cero ► Empieza Gratis

Aprende desde cero SQL, el lenguaje para gestionar y consultar bases de datos relacionales. Elabora tablas, cruza, elimina, modifica y consulta información. Conoce las funciones de MySQL como gestor de base de datos para crear aplicaciones y soluciones tecnológicas efectivas.