question 1
Je travaille avec un système où la date est stockée sous forme d'entier (numérique réel (8,0)) et j'ai remarqué que d'autres systèmes stockent également la date en tant qu'int comme cisco dans ce fil . Exemple
20120101 -- 01 Jan 2012
Y a-t-il un avantage à conserver le système de date numérique et à ne pas utiliser SQL Datetime?
question 2
Maintenant, j'essaie de parcourir la date numérique pour trouver des clients entre deux dates. Si le start
et enddate
englobe deux mois, j'obtiens des milliers d'enregistrements au lieu de seulement 60. Exemple:
create table #temp1(day int,capacity int) /* just a temp table */
declare @start int
declare @end int
set @start=20111201
set @end = 20120131
while (@start <= @end)
Begin
insert into #temp1 /* I am storing things in #temp table so data looks pretty */
exec usp_GetDailyCap @date1= @start
set @start = @start + 1;
end
select * from #temp1
Cela tire 8931 enregistrements au lieu de 60. Existe-t-il un meilleur moyen d'améliorer la logique ci-dessus, donc je ne tire que des dates valides? J'ai essayé IsDate et les sous-requêtes mais cela n'a pas fonctionné de manière efficace.
la source
Réponses:
Pour répondre à votre première question, je recommanderais d'utiliser le
DATETIME
type de données dans SQL Server. Pas nécessairement pour des raisons de performances, mais pour tirer parti des fonctionnalités spécifiques au SGBDR. Par exemple, vous devez réinventer beaucoup de logique juste pour faire des mathématiques de la date de base (pensezDATEDIFF()
,DATEADD()
,DATEPART()
et bien d' autres fonctions. Ils sont évidemment adaptées auDATETIME
type de données et sont faciles à travailler avec).Quant à votre deuxième question, vous rencontrez le problème exact vers lequel la première question (et ma réponse) est orientée . Vous regardez 20111201 et 20120131 comme dates, et votre cerveau vous dit que cela devrait être une différence de 60 jours. Eh bien, vous bouclez en fonction du delta ... qui est:
20120131 - 20111201 = 8930
(avec la boucle inclusive ce sera 8931)En d'autres termes, votre
WHILE
boucle s'exécute 8931 fois. Cela se produit car ce sont des valeurs entières et votre boucle ne sautera pas de 20111231 directement à 20120101.Vos entiers ne vont pas prendre en compte le plafond des années et des mois (c'est-à-dire votre problème de question 2 ).
la source
20121301
et20120230
et même20129999
comme une date.Vous pouvez utiliser une table de calendrier et attribuer des numéros consécutifs à vos dates, comme suit:
Numéro de date
20120229 1234
20120301 1235
Le tableau de calendrier doit être généré, mais c'est une tâche très simple.
la source
Types de données potentiels et leurs tailles / limitations:
Avantages pour le type de données numérique:
Inconvénients pour le type de données numériques:
Honnêtement, il vaut mieux utiliser le type de données de date IMHO.
la source