Speichern von Datum als Ganzzahl (numerisch), was sind die Vorteile

11

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 startund enddatezwei 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.

Jackofall
quelle
Wenn Sie SQL Server 2008 oder höher ausführen, können Sie einfach den Datentyp Datum verwenden. Es ist etwas kleiner und zwingt Sie nicht dazu, die Zeit einzuschließen, aber fast alle datetime-Funktionen von SQL funktionieren immer noch dafür.
DForck42
2
Ich sehe nur Nachteile in diesem Ansatz, überhaupt keinen Vorteil
a_horse_with_no_name

Antworten:

11

Um Ihre erste Frage zu beantworten, würde ich empfehlen, den DATETIMEDatentyp 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 (denken DATEDIFF(), DATEADD(), DATEPART()und viele andere Funktionen. Sie sind offensichtlich auf den zugeschnittene DATETIMEDatentyp 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 WHILESchleife 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 ).

Thomas Stringer
quelle
Nun, das ist genau meine Frage. Bei numerischen Daten können Schleifen Tausende umfassen, nicht nur 30 Tage oder 29 Tage. Aber denken Sie daran, dass ich mit einem professionellen System arbeite . Und sogar Cisco benutzt es, wie es scheint.
Jackofall
4
Neben Leistung und Funktionalität gibt es auch Integrität. Mit ganzen Zahlen als Datumsangaben, würde der db erlauben 20121301und 20120230sogar 20129999als Datum.
Ypercubeᵀᴹ
@ Jackofall Cisco hat nicht die Plattform eines RDBMS dahinter. Sie haben ihre eigene Logik geschrieben. Warum würden sie nicht einfach ganze Zahlen verwenden? Von Grund auf ist dies wahrscheinlich der einfachste Weg für Low-Level-Software. Aber wir sprechen hier über Äpfel und Orangen.
Thomas Stringer
3
@Jackofall: Es gibt einen großen Unterschied zwischen dem Speichern von Datumsangaben als Ganzzahlen (und dem Vorhandensein von Lücken) und dem Speichern von Datums- / Zeitstempeln als Ganzzahlen - oder sogar Datumsangaben als Ganzzahlen, wie dies bei VB / Excel der Fall ist.
Ypercubeᵀᴹ
4
Es gibt viele (wenn nicht die meisten) professionell gestalteten Datenbanken, die schlechte Techniken verwenden. Ich habe mit vielen COTS-Produkten gearbeitet und keine gesehen, die aus Datenbanksicht gut definiert waren.
HLGEM
6
  1. Ralph Kimball empfiehlt, Datumsangaben als Ganzzahlen zu speichern. Er hat viel geschrieben, sowohl Online-Artikel als auch Bücher.
  2. 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.

AK
quelle
1
Ich würde gerne den Fall sehen, in dem Sie eine Abfrage filtern, indem Sie eine Datumstabelle mit den als numerisch gespeicherten Daten verknüpfen und diese numerischen Daten mit "where [date] zwischen @startdate und @enddate"
DForck42
1
@ DForck42 Es besteht keine Notwendigkeit für den von Ihnen vorgeschlagenen Fall: "where [dateAsInt] zwischen 20120229 und 20120329" würde genau die gleichen Zeilen zurückgeben wie "where [date] zwischen '20120229' und '20120329'"
AK
3
Und was war seine Argumentation?
HLGEM
5

Mögliche Datentypen und ihre Größen / Einschränkungen:

  • Dezimal (8,0): 5 Bytes
  • Datum: 3 Bytes, 0001-01-01 bis 9999-12-31
  • Int: 4 Bytes

Vorteile für numerischen Datentyp:

  • Sie sehen hübsch aus?

Nachteile für numerischen Datentyp:

  • Erfordert benutzerdefinierten Code für die Verarbeitung von Datumsoperationen
  • Benötigt benutzerdefinierten Code, um korrekte Daten zu verwalten (dh 20120230 [30. Februar 2012] nicht zulässig)
  • Größerer Datenbedarf im Vergleich zum Datentyp Datum.

Ehrlich gesagt, verwenden Sie besser den Datumsdatentyp IMHO.

DForck42
quelle