Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Ajuda com consulta SQL para encontrar a próxima data disponível para um sistema de reservas


O seguinte deve fazer você ir. você pode querer ajustar minha amostra da função "Current_Date()" para qualquer que seja a data de início da sua reserva e sair tantos dias ....

Isso usa variáveis ​​inline do MySQL na consulta. A consulta interna é uma preparação simples de uma variável de reserva (@r) baseada em alguma data de início ( current_date() ), e une-se à tabela de itens. Ao não fazer nenhuma cláusula de junção, de outra forma pegaria uma data para cada item. No meu cenário, estou pensando em sair apenas 30 dias, então apliquei um limite dos primeiros 30 itens. Nenhuma base além de me fornecer registros suficientes para que eu não precise criar uma tabela temporária de 30 registros (ou quantos dias você quiser sair). Isso cria uma consulta com alias "JustDates" e tem uma única coluna "OpenDate". Esta é a base dos intervalos de datas para testar.

Isso agora está associado à tabela de itens, mas nenhuma condição cria um cartesiano para dizer para cada data, comparar com cada item ... #s ou 100. Isso agora me daria um possível 300 ou 3000 (10 itens de série a 30 dias ou 100 itens de série a 30 dias.

Agora que tenho um "intervalo" de todos os números de série individuais e possíveis dias para verificar a disponibilidade, agora posso consultar o sistema de reservas. Portanto, por meio de uma sub-seleção e NOT IN para um determinado SKU, SERIAL # e a POSSÍVEL Data encontrada nas reservas, quero apenas manter aqueles em que o OpenDate fornecido NÃO é encontrado. Simulei suas estruturas de tabela e coloquei um punhado de itens, vários números de série e intervalos de datas de reserva escalonados e funciona muito bem ...

Obviamente, eu garantiria índices no sku/serial para desempenho. A única alteração adicional que posso fazer é ao consultar as reservas, para excluir quaisquer reservas cuja data de término seja anterior à data de início em questão para SUA consulta e, opcionalmente, nenhuma Data de início> a ÚLTIMA data que você está considerando. Se você tem uma tonelada de reservas que abrangem anos, quem se importa com algo antigo ou algo no futuro a partir do intervalo de datas em questão.
select  items.sku,
        items.serial_number,
        JustDates.OpenDate
    from 
        ( SELECT 
                 @r:= date_add(@r, interval 1 day ) OpenDate
            FROM 
                 (select @r := current_date()) vars,
                items limit 30 ) JustDates,
        items
    where 
            sku = "ABC123"
        and sku not in ( select sku from Reservations
                            where items.sku = reservations.sku
                              and items.serial_number = reservations.serial_number
                              and justDates.OpenDate >= reservations.start_date
                              and justDates.OpenDate <= reservations.end_date )
    order by 
       items.serial_number,
       justDates.OpenDate