Quelle est la meilleure façon de représenter une plage temporelle dans CE SQL Server?

StackOverflow https://stackoverflow.com/questions/718332

  •  23-08-2019
  •  | 
  •  

Question

Je parle précisément besoin seulement heures: minutes, mais que j'ai un objet TimeSpan .NET, comment dois-je stocker que dans une base de données SQL (CE)

Était-ce utile?

La solution

Je vous recommande d'utiliser un long pour représenter le nombre de tiques . C'est ce que TimeSpan utilise comme sa représentation interne. Cela vous permet de facilement reconstituez votre objet avec le Timespan.FromTicks () procédé , et la sortie à la base de données en utilisant le Timespan .Ticks propriété. La plus petite unité de temps dans .NET est la tique, ce qui est égal à 100 nanosecondes

Autres conseils

magasin comme varchar. Enregistrer à l'aide de sql TimeSpan.ToString(). Lire à partir sql comme:

TimeSpanObj = TimeSpan.Parse(fieldValue)

CE SQL ne dispose pas d'un type de temps, ou types définis par l'utilisateur, de sorte que vos choix sont datetime ou un int représentant minutes. Si le plus grand temps que vous devez stocker 23:59 = 23 * 60 + 59 = 1439 = le nombre de minutes dans une journée à partir de 0 minute, un smallint est le plus petit type intégral qui accueillera cette gamme.

Résister à la tentation de stocker des heures et des minutes dans des colonnes séparées comme tinyints. Qui utiliseraient le même espace comme un seul smallint, mais tous les calculs des temps, il faudra multiplier par 60 heures et en ajoutant minutes, et chaque order by exigera deux colonnes au lieu d'un.

Boutique en minutes; sur l'écran, vous pouvez séparer les minutes en heures et en minutes avec

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

Je nomme la colonne (s) minutes ou absminutes (pour les minutes absolues) si vous voulez distinguer les 1439 minutes en un jour des 0-59 minutes dans une heure.

Pour convertir la valeur de base de données à un objet Timespan, utilisez le Timespan(int, int, int) de cteur comme celui-ci new TimeSpan( floor(absminutes / 60 ), absminutes % 60, 0) ou (mieux) la Timespan(long) de cteur avec new Timespan( absminutes * TimeSpan.TicksPerMinute ).

Pour insérer ou mettre à jour la base de données à partir d'un objet Timespan, fixé à absminutes someTimespan.TotalMinutes % 1440.

J'envisage actuellement l'utilisation de Time SQL pour gérer cela, mais il ne fonctionne pas pour> = 24 heures.

Les avantages sont facilement lisibles, facilement utilisable dans SQL et dans le code, mais la chute est que vous avez seulement un petit timespan à jouer avec.

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

et

SqlDataReader dr = cmd.ExecuteReader();
DelayTime = (TimeSpan) dr["DelayTime"];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top