2011-09-01 15 views
6

Estoy diseñando una tabla SQL para almacenar horas de operación para tiendas.Horas de operación de diseño Tabla SQL

Algunas tiendas tienen horarios muy simples: lunes a domingo de 9:30 AM a 10:00 PM

Otros son poco más complicado. Tenga en cuenta la situación siguiente:

Monday: Open All Day 
Tuesday: 7:30AM – 2:30PM & 4:15PM – 11:00 PM 
Wednesday: 7:00PM – 12:30 AM (technically closing on Thursday morning) 
Thursday: 9:00AM – 6:00PM 
Friday: closed. 

¿Cómo diseñaría la (s) mesa (s)?

EDITAR

Las horas se utilizarán para demostrar si una tienda está abierta en un momento seleccionado por el usuario.

Una tabla diferente puede manejar excepciones, como vacaciones.

El horario de la tienda no cambiará de una semana a otra.

Respuesta

6

una tabla como ésta sería fácil tanto para la salida informados, así como acaba de disparar un poco atrás (abierta si/no?):

Store | Day | Open | Closed 
--------------------------- 
1  | 1 | 0000 | 2400 
1  | 2 | 0730 | 1430 
1  | 2 | 1615 | 2300 
... 

Características:

  1. el uso de 24 horas no es necesario, pero hace más fácil matemáticas.
  2. La ID de la tienda presumiblemente se uniría a una tabla de búsqueda donde almacenó información de la tienda
  3. La identificación del día se traduciría al día de la semana (1 = domingo, 2 = lunes, etc.)

para consultar el conjunto de datos, simplemente: SELECT Day, Open, Close... (Lo que quiere formatear Abrir/Cerrar obviamente)

Para consultar IsOpen ?, simplemente:

SELECT CASE WHEN @desiredtime BETWEEN Open AND Closed THEN 1 ELSE 0 END 
FROM table 
WHERE store = @Store 
2

¿Tiene que hacer más que almacenar y mostrarlo?

Creo que un diseño que necesita saber si una tienda está abierta en un momento determinado debería estar informado de todas las posibilidades, de lo contrario, terminará por no poder acomodar algo.

¿Qué pasa con las excepciones de vacaciones?

Consideraría almacenarlos como intervalos basados ​​en un tiempo base (minutos desde la hora 0 de una semana).

Entonces 0 es la medianoche del lunes.

Intervalo 1 sería 0 - 1440

Intervalo 2 sería 1890-2310

etc.

Desde aquí se puede convertir un tiempo seleccionado por el usuario en un desplazamiento minuto y determinar si era una tienda abierto.

Su único problema restante sería la interpretación en la pantalla para la visualización de usar (probablemente algunos extensa lógica, pero no imposible) y se solapan en el tiempo 10080 -> 0.

+0

Almacenaremos las excepciones de vacaciones en una tabla diferente. – Emil

+0

Utilizaremos las horas para ver si una tienda está abierta a la hora seleccionada por el usuario, por lo que no es solo para mostrarla en la pantalla. – Emil

+1

@Emil Vea el concepto editado. –

3

Piense en ello más como definir los marcos de tiempo, los días/semanas son más complejos, porque tienen reglas y comienzan y se detienen definidos.

¿Cómo definirías un marco de tiempo?

una restricción (inicio [Fecha y Hora]), una referencia 'duración' (horas, minutos, .. del margen) *. Ahora los cambios (marcos de tiempo) pueden abarcar varios días y no es necesario trabajar con lógica compleja para extraer y usar los datos en los cálculos.

**Store_Hours** 

Store | Day | Open | DURATION 
--------------------------- 
1  | 1 | 0000 | 24 
1  | 2 | 0730 | 7 
1  | 2 | 1615 | 6.75 
... 
1  | 3 | 1900 | 5.5 
+0

También estaba considerando la duración, pero podría ser más difícil determinar si una tienda está abierta a la 1:00 a.m. del lunes. Necesitamos verificar los domingos y los lunes – Emil

+0

'SELECCIONE LA CASILLA CUANDO @desiredtime ENTRE Open Y DateAdd (hh, duration, Open) THEN 1 ELSE 0 END FROM tabla WHERE store = @ Store' ¿No es difícil? –

+0

la declaración es un poco más complicada. Necesitamos el día también, por lo que debemos verificar tanto el día deseado como el día anterior en caso de que la duración se reduzca a hoy. Entonces, si estamos buscando el día = 1, también debemos verificar si el día = 7 tiene un caso cuando abre + duración> 24. – Emil