Qual é a melhor maneira de representar um período de tempo no SQL Server CE?
-
23-08-2019 - |
Pergunta
Especificamente falando, eu apenas horas precisam: minutos, mas dizer que tenho um objeto .NET TimeSpan, como devo guardar isso em um banco de dados SQL (CE)
?Solução
Eu recomendo usar um longo para representar o número de carrapatos . Isso é o que TimeSpan usos como de representação interna. Isso permite que você facilmente reconstituir o seu objeto com a Timespan.FromTicks () método , e saída para a base de dados utilizando o Timespan .Ticks propriedade. A menor unidade de tempo em .NET é o carrapato, que é igual a 100 nanossegundos
Outras dicas
loja como um varchar. Salvar para SQL usando TimeSpan.ToString()
. Leia a partir do SQL como:
TimeSpanObj = TimeSpan.Parse(fieldValue)
SQL CE não tem um tipo de tempo, ou tipos definidos pelo usuário, de modo que suas escolhas são datetime ou um int representando minutos. Se o maior tempo que você precisa para loja é 23:59 = 23 * 60 + 59 = 1439 = o número de minutos em um dia a partir de minuto 0, um smallint é o menor tipo integral que irá acomodar nesse intervalo.
Resista à tentação de armazenar horas e minutos em colunas separadas como tinyints. Que usaria o mesmo espaço que um único smallint, mas, em seguida, todos os cálculos de vezes exigirá horas multiplicar por 60 e adicionando minutos, e cada order by
exigirá duas colunas em vez de um.
loja de minutos; em exibição, você pode separar os minutos horas e minutos com
select floor( absminutes / 60 ) as hours, absminutes % 60 as minutes,
from some table
order by absminutes;
Eu nomear a coluna (s) minutes
, ou absminutes
(para minutos absolutos) se você quiser distinguir os 1439 minutos em um dia a partir das 0-59 minutos em uma hora.
Para converter a partir do valor base de dados para um objeto Timespan, utilize o Timespan(int, int, int)
ctor assim new TimeSpan( floor(absminutes / 60 ), absminutes % 60, 0)
ou (melhor) a Timespan(long)
ctor com new Timespan( absminutes * TimeSpan.TicksPerMinute )
.
Para inserir ou atualizar o banco de dados a partir de um objeto Timespan, absminutes definidos para someTimespan.TotalMinutes % 1440
.
Atualmente estou pensando em usar Tempo SQL para lidar com isso, mas não vai funcionar para> = 24 horas.
Os benefícios incluem facilmente legível, facilmente utilizável tanto em SQL e em código, mas a queda é que você só tem um pequeno período de tempo para brincar.
declare @delay table (DelayTime Time(3))
insert into @delay values ('00:10:00.000')
select getdate() as nowtime, getdate()+DelayTime as nowPlusTen from @delay
e
SqlDataReader dr = cmd.ExecuteReader();
DelayTime = (TimeSpan) dr["DelayTime"];