Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

235
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda