es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe una función SQL para seleccionar una muestra de una base de datos basada en el cálculo de subcadenas convertidas de una columna específica?

Tengo una tabla grande que estoy tratando de filtrar, sin embargo, los datos que tengo están bastante desordenados. Necesito encontrar contratos con menos de cierta cantidad de tiempo restante, sin embargo, solo hay una columna que contiene los tiempos de los contratos. Llamémosla “Term”. Los datos dentro de Term se ven aproximadamente así:


x años a partir del dd de MMMM de aaaa

Por ejemplo, para un contrato de 30 años que comienza el 12/12/2020, la entrada de esa fila en la columna Term se vería así:


30 años a partir del 12 de diciembre de 2020

La tarea es encontrar contratos con menos de x años restantes. Como podrás notar por el lenguaje utilizado en esta pregunta, soy un poco novato, así que trata de ser amable conmigo. He intentado lo siguiente (para este ejemplo, supongamos que estoy buscando contratos con menos de 10 años restantes, sin embargo, algunos de estos contratos pueden tener más de 100 años):


SELECT * FROM mydb WHERE
(CAST(LEFT(Term,POSITION(" " IN Term)) AS DECIMAL(4,0))) + (CAST(RIGHT(Term,4) AS DECIMAL(4,0))) - year(curdate()) < 10

Pero obviamente no está funcionando y no sé por qué.

¡Desde ya, muchas gracias por tu ayuda!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para filtrar los contratos con menos tiempo restante, podemos usar las funciones LEFT y RIGHT en SQL para extraer los valores numéricos de la columna Term, convertirlos a decimales y luego restar el año actual para obtener la cantidad restante de años. Aquí está la consulta corregida de SQL:

    SELECT * FROM mydb WHERE
    (CAST(LEFT(`Term`,POSITION(' ' IN `Term`)) AS DECIMAL(4,0))) + (CAST(RIGHT(`Term`,4) AS DECIMAL(4,0))) - YEAR(CURDATE()) < 10
    

    Tenga en cuenta que cambiamos las comillas alrededor del caracter espacio de " a ' y también corregimos el operador de comparación de < a <.

    Esta consulta debería filtrar los contratos con menos de 10 años restantes, independientemente de si son más de 100 años de duración. Sin embargo, es importante tener en cuenta que este enfoque puede no ser adecuado para todos los casos de datos sucios, y es importante verificar cuidadosamente los resultados para asegurarse de que sean precisos.

Comments are closed.