Frage 1
Ich arbeite mit einem System, in dem das Datum als Ganzzahl (tatsächliche Zahl (8,0)) gespeichert ist, und ich habe festgestellt, dass andere Systeme das Datum auch als int speichern, z. B. Cisco in diesem Thread . Beispiel
20120101 -- 01 Jan 2012
Gibt es einen Vorteil, das numerische Datumssystem beizubehalten und SQL Datetime nicht zu verwenden?
Frage 2
Jetzt versuche ich, das numerische Datum zu durchlaufen, um Kunden zwischen zwei Daten zu finden. Wenn das start
und enddate
zwei Monate umfasst, erhalte ich Tausende von Datensätzen anstelle von nur 60. Beispiel:
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
Dadurch werden 8931 Datensätze anstelle von 60 abgerufen. Gibt es eine bessere Möglichkeit, die obige Logik zu verbessern, sodass nur gültige Daten abgerufen werden? Ich habe IsDate und Unterabfragen ausprobiert, aber das hat nicht ganz effizient funktioniert.
quelle
Antworten:
Um Ihre erste Frage zu beantworten, würde ich empfehlen, den
DATETIME
Datentyp in SQL Server zu verwenden. Nicht unbedingt aus Leistungsgründen, sondern um die RDBMS-spezifische Funktionalität zu nutzen. Zum Beispiel würden Sie eine Menge Logik neu erfinden müssen nur Ecktermin Mathematik zu tun (denkenDATEDIFF()
,DATEADD()
,DATEPART()
und viele andere Funktionen. Sie sind offensichtlich auf den zugeschnitteneDATETIME
Datentyp und sind einfach zu Arbeit mit).Bei Ihrer zweiten Frage stoßen Sie auf das genaue Problem, auf das die erste Frage (und meine Antwort) ausgerichtet ist . Sie betrachten 20111201 und 20120131 als Daten und Ihr Gehirn sagt Ihnen, dass dies ein Unterschied von 60 Tagen sein sollte. Nun, Sie durchlaufen eine Schleife basierend auf dem Delta ... das ist:
20120131 - 20111201 = 8930
(Mit der Inklusivschleife ist es 8931)Mit anderen Worten, Ihre
WHILE
Schleife wird 8931 Mal ausgeführt. Dies geschieht, weil dies ganzzahlige Werte sind und Ihre Schleife nicht direkt von 20111231 zu 20120101 springt.Ihre ganzen Zahlen berücksichtigen nicht die Obergrenze von Jahren und Monaten (dh Ihr Problem mit Frage 2 ).
quelle
20121301
und20120230
sogar20129999
als Datum.Sie können eine Kalendertabelle verwenden und Ihren Daten wie folgt fortlaufende Nummern zuweisen:
Datumsnummer
20120229 1234
20120301 1235
Die Kalendertabelle muss generiert werden, ist aber eine sehr einfache Aufgabe.
quelle
Mögliche Datentypen und ihre Größen / Einschränkungen:
Vorteile für numerischen Datentyp:
Nachteile für numerischen Datentyp:
Ehrlich gesagt, verwenden Sie besser den Datumsdatentyp IMHO.
quelle