Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

236
Vistas
Convierta dígitos extraídos por coincidencia de subcadena en años en PostgreSQL 11.0

Tengo la siguiente tabla en PostgreSQL 11.0

 min age max age 1 Month 12 Months 1 Year 16 Years 1 Day 365 Days 365 Days 369 Days N/AN/A NULL NULL

Me gustaría convertir los valores al año. Estoy extrayendo la cadena después del dígito y compruebo si son 'años', 'meses' o 'días' y luego convierto el dígito antes de la cadena en año.

Intenté la siguiente consulta:

 update tbl set min_age = case when substring(min_age, '^\d+\s(.*)') ~* 'Month' then abs(substring(min_age, '^(\d+)\s.*')/12) when substring(min_age, '^\d+\s(.*)') ~* 'Months' then abs(substring(min_age, '^(\d+)\s.*')/12) when substring(min_age, '^\d+\s(.*)') ~* 'Day' then abs(substring(min_age, '^(\d+)\s.*')/365) when substring(min_age, '^\d+\s(.*)') ~* 'Days' then abs(substring(min_age, '^(\d+)\s.*')/365) when substring(min_age, '^\d+\s(.*)') ~* 'Year' then abs(substring(min_age, '^(\d+)\s.*')) when substring(min_age, '^\d+\s(.*)') ~* 'Years' then abs(substring(min_age, '^(\d+)\s.*')) end ; update tbl set max_age = case when substring(min_age, '^\d+\s(.*)') ~* 'Month' then abs(substring(min_age, '^(\d+)\s.*')/12) when substring(min_age, '^\d+\s(.*)') ~* 'Months' then abs(substring(min_age, '^(\d+)\s.*')/12) when substring(min_age, '^\d+\s(.*)') ~* 'Day' then abs(substring(min_age, '^(\d+)\s.*')/365) when substring(min_age, '^\d+\s(.*)') ~* 'Days' then abs(substring(min_age, '^(\d+)\s.*')/365) when substring(min_age, '^\d+\s(.*)') ~* 'Year' then abs(substring(min_age, '^(\d+)\s.*')) when substring(min_age, '^\d+\s(.*)') ~* 'Years' then abs(substring(min_age, '^(\d+)\s.*')) end

La salida esperada es:

 min age max age 0 1 1 16 0 1 1 1 N/AN/A NULL NULL

Cualquier ayuda es muy apreciada.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Postgres tiene potentes funciones de intervalo. Creo que un cast y justify_interval() podrían funcionar aquí:

 select extract(year from justify_interval(min_age::interval)) min_age, extract(year from justify_interval(max_age::interval)) max_age from tbl

Demostración en DB Fiddle :

min_año | max_yr
:----- | :-----
0 | 1     
1 | dieciséis    
0 | 1     
1 | 1     
over 4 years ago · Santiago Trujillo Denunciar

0

Así es como puede obtener todos los valores que necesita:

 select split_part(min_age, " ", 1) as min_age_value, split_part(min_age, " ", 2) as min_age_unit, split_part(max_age, " ", 1) as max_age_value, split_part(max_age, " ", 2) as max_age_unit from tbl;

Ahora, puede usar lo anterior como una subcadena y usar case-when para min_age_unit y max_age_unit en la consulta externa, evaluándolo a 1, 12 o 365 respectivamente y multiplicándolo por el valor real.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda