2009-05-01 18 views
7

¿Cómo almacenaría un rango de tiempo o tiempo en SQL? No será una fecha determinada porque solo será, digamos, las 4:30 p. M. (No, el 3 de enero, a las 4:30 p.m.). Esas serían reuniones semanales o diarias. El tipo de consultas que necesito son, por supuesto, para mostrar, pero también incluirán consultas complejas como evitar conflictos en el cronograma. Prefiero elegir el mejor tipo de datos para eso ahora.Almacenar la hora del día en SQL

estoy usando MS SQL Server Express 2005.

Gracias!

Nathan

Respuesta

4

yo recomendaría dejar de utilizar un tipo de datos DateTime e ignorando los valores de fecha - idealmente usando MinDate estática para SQL (Google él). Esto le dará los beneficios de trabajar con un campo fuertemente tipado y el único costo será unos pocos bytes adicionales.

En cuanto a los rangos, guárdelos en dos columnas separadas. Luego puede restar uno de otro para determinar la diferencia.

Editar: hicimos algunas búsquedas en Google.

  • SQL Server 2008 agrega un tipo de datos de tiempo, por lo que es posible que desee considerarlo.
  • Puede utilizar SQL 2005 de tipo DateTime y combinarla con la función CONVERT para extraer sólo el HH: MM: SS.mmm
  • Diferentes versiones de SQL admiten diferentes fechas mínimas. Se podría utilizar una fecha estática que será apoyado por todos como el 1/1/2000, o puede utilizar el valor mínimo de SQL 2005 de 1/1/1753 y anexar los valores de tiempo para ese día startic

Así si te quedas con 2005, elige tu fecha estática, como 1/1/2000, y almacena tus tiempos en ella. Entonces 1m: 30s sería 2000-1-1 00: 01: 30.000, y 1h: 15m sería 2000-1-1 01: 15: 00,000

Puede hacer Fecha2 - Fecha1 y obtener el resultado de (1h: 15: m - 1m: 30s) 2000-01-01 01: 13: 45.000. CONVERSALO y tendrás 1:13:45.

+0

tenga en cuenta que el uso de CONVERTIR de esta manera desactivará el uso de índices en la columna de fecha y hora –

+0

Interesante, no estaba al tanto de ese efecto. Gracias por la sugerencia – STW

+0

Para futuros lectores, antes de usar este método, compruebe el comentario realizado por @tvanfosson http://stackoverflow.com/questions/812631/store-time-of-the-day-in-sql?lq=1#comment622411_812669 – Termiux

1

Puede almacenarlo como un int en formato de 24 horas y formatee según sea necesario.

o almacenarla como una fecha y hora con una fecha fija y quitar según sea necesario para su visualización: 1 Ene el año 2000 16:30

me gustaría ir con el campo de fecha y hora, ya que le da el poder de toda la fecha y hora relacionada funcionalidad.

1

Es posible que desee considerar almacenarla como una columna int que representa el número de minutos desde la medianoche. En su entidad podría exponer esto como un TimeSpan (o int) que representa lo mismo. Solo necesita convertir los valores de visualización (formato de tiempo) y el valor de la base de datos (minutos) para realizar sus consultas y esto podría hacerse fácilmente en su entidad (TimeSpan.TotalMinutes, por ejemplo).

+0

Esa es una solución justa, pero no es intuitiva mirando la mesa o es fácil de modificar (¿y si quieren plantear la resolución? Tendrían que modificar los valores existentes). El uso de un tipo de datos provisto, especialmente para datos con reglas intrínsecas como el tiempo, evita tener que hacer muchos cálculos manuales, y también lo hace mucho más obvio para futuros desarrolladores. – STW

+0

Suponiendo que la precisión requerida es de segundos, una alternativa es un int en el formato hhmmss. No es tan útil si necesita calcular una diferencia entre dos veces, pero hace que las consultas sean más legibles: WHERE Time> = 120000 AND Time <130000. – Joe

+1

@Yooder - es precisamente porque usar DateTime podría confundir a futuros desarrolladores que evitaría para este propósito. Normalmente, con un DateTime esperaría que la porción de fecha fuera válida. ¿Qué sucede si el futuro desarrollador decide usar alguna otra fecha como punto fijo (o usa DateTime.Today)? Almacenarlo como una columna con un nombre adecuado "MinutesFromMidnight" deja muy claro cuál es la intención. La matemática funciona aproximadamente el mismo 2:30 PM aún después de la 1:30 PM y antes de las 2:30 PM. La conversión es trivial: TimeSpan.FromMinutes(). TimeSpan también formatea fácilmente. – tvanfosson

6

Personalmente, me parece una razón para actualizar a 2008 que tiene un tipo de datos de tiempo por separado.

+0

En segundo lugar, noción, especialmente porque estamos hablando de la edición Express (que espero signifique que este no es un gran sistema de producción). Un pequeño dolor de actualización valdría la pena aquí. – STW

+0

+1 de acuerdo ...... –

0

me parece que está desarrollando un tipo de planificador de reuniones o algo para mostrar las reuniones.

Creo que lo establecería p con 2 columnas MeetingStart y MeetingEnd, ambos como campos de fecha y hora. De esta forma, puede determinar la duración de la reunión y, como ya tiene la fecha, puede usarla fácilmente para mostrarla en un calendario o algo así.

Cuestiones relacionadas