Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

273
Views
Encuentra cuántas máquinas tragamonedas puedo usar dentro del período de tiempo dado

Estoy trabajando en el proyecto de reserva / reserva y me enfrenté a un problema interesante.

El objetivo del proyecto es determinar si hay algún horario disponible para reservar dentro del período de tiempo dado (12:00 - 15:00).

Además, admite la cantidad N de salas/mesas que se permite reservar. (por ejemplo, máximo se podría reservar hasta 30 habitaciones)

Actualmente, los datos se almacenan en la base de datos mysql, con la estructura:

 id, start_time, end_time and some another payload

En primer lugar, estaba seguro de que puedo hacer una selección de sql simple para determinar las superposiciones y contar la cantidad de filas devueltas

sql-query se ve así:

 SELECT * FROM reservations WHERE ((start_time < '${end_time}' AND start_time >= '${start_time}') OR (start_time <= '${start_time}' AND end_time >= '${end_time}') OR (end_time > '${start_time}') ${start_time} - time recieved from the front-end start_time - column name in the database table.

Pero eventualmente termino con el gran error. La línea de tiempo es horizontal, cada rectángulo representa una de las reservas creadas. Espacio vacío significa que hay una mesa/sala vacía que podría reservarse.

Pero al usar esta selección para verificar la tabla disponible para el rango de tiempo desde las 16:00 hasta las 19:00, la consulta devuelve más de 50 filas y if > N_amount responde que no hay mesa / sala disponible para ese tiempo disponible (pero eso es obviamente no es verdad).

fila de ejemplo: id=1, start_time=2022-08-06 12:00:00, end_time=2022-08-06 15:00:00

Cada franja horaria se redondea a **:30 o **:00 minutos

¿Alguna idea sobre cómo cambiar la consulta/lógica para lograr el comportamiento deseado?

mesa delantera

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Cuando lo entiendo bien, está tratando de obtener todas las reservas entre una hora de inicio y una hora de finalización. (start_time < '${end_time}' AND start_time >= '${start_time}') Esta consulta le da a cada reserva una hora de inicio antes del final del intervalo de tiempo y una hora de inicio después del inicio del intervalo de tiempo

(start_time <= '${start_time}' AND end_time >= '${end_time}') Con esa consulta, recibe todas las reservas con una hora_de_inicio antes del intervalo de tiempo y con una hora de finalización posterior al intervalo de tiempo

(end_time > '${start_time}') Con esa consulta, recibe todas las reservas con una hora de finalización posterior a la hora de inicio solicitada desde la interfaz, lo que le proporciona cada reserva con una hora de finalización posterior a la hora de inicio solicitada. Creo que ese es el principal problema.

Ahora, en primer lugar, eche un vistazo a esta página https://www.stackhawk.com/blog/node-js-sql-injection-guide-examples-and-prevention/ que le brinda información importante sobre SQL-Injection. ¡Tu código tiene un gran problema de seguridad! En Node.JS, una solución para eso puede verse así:

 connection.query('SELECT * FROM sheet where id = ?', [id], (err, rows) => { //code });

Para obtener mejores resultados, recomendaría buscar todas las reservas que solo tienen una hora de inicio en ese intervalo de tiempo y luego colocar la reserva completa en su mesa. SELECT * FROM reservations WHERE ((reservations.start_time >= *start_time* AND reservations.start_time < *end_time*) OR (reservations.end_time > *start_time* AND reservations.end_time <= *end_time*))

Con esa consulta, está recibiendo todas las reservas que tienen una hora de inicio en ese rango o una hora de finalización en ese rango, lo que debería darle buenos resultados. Recuerde reemplazar mis ** empastes con ? como se muestra en el ejemplo anterior

about 4 years ago · Juan Pablo Isaza Report

0

No diste suficiente información.

  • Manteniéndolo simple, cada fila en la tabla SQL representa la sala/mesa y la fecha que se reserva.

  • Nadie comienza un día y lo mantiene hasta el día siguiente. Por ejemplo, hora de inicio = 23:00 durante una hora y media, cruzando la medianoche hasta el día siguiente.

En lugar de pedirle al usuario la fecha, la hora de inicio y la hora de finalización, le pediría la(s) fecha(s) de servicio y luego les daría una matriz de casillas de verificación que representan los espacios disponibles para que el usuario las verifique.

Asumiré que la tabla SQL tiene una fila para cada habitación y fecha donde están las columnas de la fila:
date , room , slot0 , ... slot47 (48 espacios de media hora) suponiendo disponibilidad las 24 horas

Crearía un objeto para la conversión del número de intervalo de tiempo (0-47) al nombre de la columna de intervalo de tiempo (0-47):

 const slots = ['slot0','slot1',...'slot47'];

Calculas la franja horaria de la primera media hora.
Luego calcule el número de ranuras necesarias.
A partir de eso construyes la consulta. Para una hora de inicio a las 15:00 y se necesitan 3 espacios.
15:00 se traduce a slot29 y 15:30 se traduce a slot30 .

Podrías usar otro objeto para traducir la hora a un intervalo de tiempo:<

 const hour2slot = {0:[0],1:[2],2:[4]... 23:[46]}

Luego traduzca los minutos :00 y :30 a uno o cero.

 const minutes = {0:[0], 30:[1]}

Así que la primera franja horaria:

 timeslot1 = hour2slot[hour] + minutetoslot[minutes]

Luego construye la consulta con un bucle for.

 var where = 'WHERE `DATE` = date AND' + slots[timeslot1] + "= ''" for slot=timeslot1, slot < number_of_slots,slot++){ var where = where + ' AND ' + slots[slot] + "=''" } var sql = 'SELECT `room` FROM `table` ' + where + ' LIMIT 1'

No revisé mis matemáticas o código, pero deberías tener una idea.
El resultado sería:

 SELECT `room` FROM `table` WHERE `slot29` = '' AND `slot30`='' AND `slot31` = '' LIMIT 1

Pero esto sería mucho más sencillo para crear una tabla con las franjas horarias disponibles para ser seleccionadas por el usuario.

Por cierto, nunca uso SELECT * FROM

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!