Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] CONSULTAS NO POSTGRESQL

Tenho uma tabela de reservas em um hotel e preciso pegar a ultima reserva pela data, porém, a data veio em três campos 'ano', 'mes' e 'dia'. Qual query utilizar para realizar esta consulta?

OBS: Os campos 'dia' e 'mes' não possuem padrão de dados, alguns vem com valor '02' e outros com valor apenas '2'

CREATE TABLE tb_RESERVAS(
    id VARCHAR(20) PRIMARY KEY NOT NULL,
    ADULTOS_QNT INT NOT NULL,
    CRIANCAS_QNT INT NOT NULL,
    DIAS_FIM_DE_SEMANA INT NOT NULL,
    QNT_DIAS_MEIO_SEMANA INT NOT NULL,
    COM_ESTACIONAMENTO VARCHAR(5) NOT NULL,
    TEMPO_DE_ESPERA INT NOT NULL,
    ANO CHAR(4) NOT NULL,
    MES INT NOT NULL,
    DIA INT NOT NULL,
    TIPO_RESERVA VARCHAR(20) NOT NULL,
    PRECO_QUARTO DECIMAL(10,2) NOT NULL,
    QNT_PEDIDOS_ESPECIAIS INT NOT NULL,
    ID_RESERVA_ESTADO SERIAL UNIQUE  
);
1 resposta
solução!

Olá, Yan, tudo bem?

Para realizar essa consulta, você pode usar a função TO_DATE ou DATE para converter esses campos em um único campo de data e, em seguida, ordenar os resultados por essa data.

Aqui está um exemplo de query:

SELECT *
FROM tb_RESERVAS
ORDER BY DATE(ANO || '-' || LPAD(MES::TEXT, 2, '0') || '-' || LPAD(DIA::TEXT, 2, '0')) DESC
LIMIT 1;

Esta consulta concatena os campos 'ANO', 'MES' e 'DIA' em um formato de data (YYYY-MM-DD), converte essa string em um tipo de dado DATE. Em seguida, ordena em ordem decrescente para obter a data mais recente e seleciona o primeiro registro.

Fiz o teste e funcionou certinho:

captura de tela da saída. É retornado a linha cujo id é R005

Para os testes, utilizei os seguintes dados no INSERT TO:

INSERT INTO tb_RESERVAS (
    id, ADULTOS_QNT, CRIANCAS_QNT, DIAS_FIM_DE_SEMANA, QNT_DIAS_MEIO_SEMANA, COM_ESTACIONAMENTO, TEMPO_DE_ESPERA, ANO, MES, DIA, TIPO_RESERVA, PRECO_QUARTO, QNT_PEDIDOS_ESPECIAIS
) VALUES
('R001', 2, 1, 2, 3, 'SIM', 10, '2024', 5, 15, 'Standard', 300.00, 2),
('R002', 1, 0, 1, 4, 'NAO', 5, '2023', 12, 31, 'Deluxe', 450.00, 1),
('R003', 3, 2, 3, 2, 'SIM', 20, '2024', 1, 5, 'Suite', 700.00, 3),
('R004', 2, 0, 2, 3, 'SIM', 15, '2024', 3, 22, 'Standard', 280.00, 0),
('R005', 4, 2, 4, 1, 'NAO', 30, '2024', 12, 31, 'Presidential', 1500.00, 4);

Espero ter ajudado.

Qualquer dúvida, compartilhe no fórum.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!