2009-04-05 23 views

Respuesta

38

Yo recomendaría utilizar un largo para representar el número de ticks. Eso es lo que usa TimeSpan ya que es una representación interna. Esto le permite reconstituir fácilmente su objeto con el método Timespan.FromTicks(), y enviarlo a la base de datos usando el Timespan.Ticks property. La unidad de tiempo más pequeña en .NET es la marca, que es igual a 100 nanosegundos

+2

eso es exactamente lo que estoy haciendo en el proyecto que estoy trabajando. La capa ORM realiza la conversión como lo ha dicho, entre TimeSpan y ticks, ida y vuelta, sin margen de error. Además, una ventaja adicional es que tienes toda la precisión que probablemente necesites. Si te quedas con los minutos, tienes un problema real si el departamento de marketing dice "¿Qué tan difícil sería bajar la precisión a segundos?" –

+0

Agradable, aunque ¿se garantiza una garrapata para tomar exactamente 100 nanosegundos? – SepehrM

+0

La documentación de Framework no menciona ninguna sala de wiggle: https://msdn.microsoft.com/en-us/library/system.datetime.ticks(v=vs.110).aspx –

1

SQL CE no tiene un tipo de hora, o tipos definidos por el usuario, por lo que sus opciones son datetime o int que representan los minutos. Si el tiempo más grande que necesita almacenar es 23:59 = 23 * 60 + 59 = 1439 = el número de minutos en un día comenzando desde el minuto 0, una pequeña letra es el tipo integral más pequeño que acomodará ese rango.

Resista la tentación de almacenar horas y minutos en columnas separadas como tinyints. Eso usaría el mismo espacio como una pequeña miniatura, pero luego cada cálculo de tiempos requerirá multiplicar horas por 60 y agregar minutos, y cada order by requerirá dos columnas en lugar de una.

Almacenar en minutos; en la pantalla, se puede separar en las horas y minutos minutos con

select floor(absminutes/60) as hours, absminutes % 60 as minutes, 
from some table 
order by absminutes; 

que nombraría la columna (s) minutes o absminutes (para los minutos absolutos) si se quiere distinguir los minutos en 1439 de un día de los 0-59 minutos en una hora.

convertir del valor de base de datos a un objeto Timespan, utilice el ctor Timespan(int, int, int) como este new TimeSpan(floor(absminutes/60), absminutes % 60, 0) o (mejor) la ctor Timespan(long) con new Timespan(absminutes * TimeSpan.TicksPerMinute).

Para insertar o actualizar la base de datos de un objeto Timespan, establezca absminutes en someTimespan.TotalMinutes % 1440.

1

Almacenar como varchar. Guardar en sql usando TimeSpan.ToString(). Leer desde SQL como:

TimeSpanObj = TimeSpan.Parse(fieldValue) 
+3

¿Por qué se ha bajado este valor? Es una sugerencia legítima, y ​​si tiene que editar los datos SQL directamente, es mucho más fácil escribir "2 minutos" como ''00: 02'' en lugar de' 1200000000' –

0

actualmente estoy considerando usar Tiempo SQL para manejar esto, pero no va a funcionar para> = 24 horas.

Las ventajas incluyen lectura fácil, fácil de usar tanto en SQL como en código, pero la caída es que solo tiene un pequeño intervalo de tiempo para jugar.

declare @delay table (DelayTime Time(3)) 
insert into @delay values ('00:10:00.000') 
select getdate() as nowtime, getdate()+DelayTime as nowPlusTen from @delay 

y

SqlDataReader dr = cmd.ExecuteReader(); 
DelayTime = (TimeSpan) dr["DelayTime"]; 
Cuestiones relacionadas