Quelle est la meilleure façon de représenter un timespan dans SQL Server CE?

Plus précisément, je n'ai besoin que d'heures: minutes mais disons que j'ai un objet. net TimeSpan, Comment dois-je le stocker dans une base de données SQL(CE)?

26
demandé sur Mark Byers 2009-04-05 08:21:17

4 réponses

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

38
répondu Bob King 2015-07-21 16:25:02

SQL CE n'a pas de type d'heure, ni de types définis par l'utilisateur, donc vos choix sont datetime ou un int représentant les minutes. Si le plus grand temps que vous devez stocker est 23:59 = 23 * 60 + 59 = 1439 = le nombre de minutes par jour à partir de la minute 0, un smallint est le plus petit type intégral qui pourra accueillir cette plage.

Résistez à la tentation de stocker les heures et les minutes dans des colonnes séparées sous forme de tinyints. Cela utiliserait le même espace qu'un seul smallint, mais chaque calcul il faudra multiplier les heures par 60 et ajouter des minutes, et chaque order by nécessitera deux colonnes au lieu d'une.

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

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

Je nommerais la(Les) colonne (s) minutes, ou absminutes (pour les minutes absolues) si vous voulez distinguer les 1439 minutes par jour des 0-59 minutes par heure.

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

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

1
répondu tpdi 2009-04-05 05:29:02

Stocker en tant que varchar. Enregistrer dans sql en utilisant TimeSpan.ToString(). Lire à partir de sql comme:

TimeSpanObj = TimeSpan.Parse(fieldValue)
1
répondu Bubba 2012-12-20 19:19:00

J'envisage actuellement D'utiliser SQL Time pour gérer cela, mais cela ne fonctionnera pas pendant > = 24 heures.

Les avantages comprennent facilement lisible, facilement utilisable à la fois dans SQL et dans le code, mais la chute est que vous avez seulement un petit laps de temps pour 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"];
0
répondu rugg 2015-04-22 16:02:21