Memorizzare la data come intero (numerico), quali sono i vantaggi


11

Domanda 1

Sto lavorando con un sistema in cui la data è memorizzata come numero intero (numerico effettivo (8,0)) e ho notato che anche altri sistemi memorizzano la data come int come Cisco in questo thread . Esempio

20120101  -- 01 Jan 2012

C'è qualche vantaggio nel mantenere il sistema di data numerico e non usare SQL Datetime?

Domanda 2

Ora sto cercando di scorrere la data numerica per trovare i clienti tra due date. Se il starte enddatecomprende due mesi, ottengo migliaia di record anziché solo 60. Esempio:

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

Questo tira 8931 record invece di 60. Esiste un modo migliore per migliorare la logica di cui sopra, quindi estraggo solo date valide? Ho provato IsDate e le query secondarie ma non ha funzionato in modo efficiente.


Se si esegue SQL Server 2008 o versione successiva, è possibile utilizzare il tipo di dati Date. È un po 'più piccolo e non ti obbliga a includere il tempo, ma quasi tutte le funzioni datetime di SQL funzionano ancora per questo.
DForck42,

2
Vedo solo svantaggi in questo approccio senza alcun vantaggio
a_horse_with_no_name

Risposte:


11

Per rispondere alla tua prima domanda, consiglierei di utilizzare il DATETIMEtipo di dati in SQL Server. Non necessariamente per motivi di prestazioni, ma per sfruttare la funzionalità specifica di RDBMS. Per esempio, si dovrà reinventare un sacco di logica solo per fare data la matematica di base (pensate DATEDIFF(), DATEADD(), DATEPART()e molte altre funzioni. Sono ovviamente su misura per il DATETIMEtipo di dati e sono facili da lavorare con).

Per quanto riguarda la tua seconda domanda, stai incontrando il problema esatto a cui è orientata la prima domanda (e la mia risposta) . Stai guardando le date 20111201 e 20120131 e il tuo cervello ti sta dicendo che dovrebbe esserci una differenza di 60 giorni. Bene, stai eseguendo il loop in base al delta ... che è:

20120131 - 20111201 = 8930 (con il ciclo inclusivo sarà 8931)

In altre parole, il tuo WHILEciclo viene eseguito 8931 volte. Ciò accade perché si tratta di valori interi e il tuo loop non salterà dal 20111231 direttamente al 20120101.

I vostri numeri interi non terranno conto del limite di anni e mesi (ovvero il problema della domanda 2 ).


Bene, questa è esattamente la mia domanda. Per le date numeriche, i loop possono andare in migliaia, non solo 30 o 29 giorni. Ma tieni presente che sto lavorando con un sistema professionale . E anche Cisco lo usa come sembra.
Jackofall,

4
Oltre a prestazioni e funzionalità, c'è anche integrità. Con interi come le date, il db permetterebbe 20121301ed 20120230e anche 20129999come una data.
ypercubeᵀᴹ

@Jackofall Cisco non ha la piattaforma di un RDBMS alle spalle. Hanno scritto la propria logica. Perché non dovrebbero usare solo numeri interi? Da zero, questo è probabilmente il modo più semplice per software di basso livello. Ma stiamo parlando di mele e arance qui.
Thomas Stringer,

3
@Jackofall: c'è una grande differenza tra la memorizzazione di date come numeri interi (e la presenza di spazi vuoti) e la memorizzazione di dati / timestamp come numeri interi - o persino le date come numeri interi, come fa VB / Excel.
ypercubeᵀᴹ

4
Esistono molti database (se non la maggior parte) progettati professionalmente che usano tecniche sbagliate. Ho lavorato con molti prodotti COTS e non ne ho visti nessuno ben progettato dal punto di vista del database.
HLGEM,

6
  1. Ralph Kimball consiglia di memorizzare le date come numeri interi. Ha scritto molto, sia articoli online che libri.
  2. È possibile utilizzare una tabella del calendario ed emettere numeri consecutivi per le date, come segue:

    Numero data

    20120229 1234

    20120301 1235

La tabella del calendario deve essere generata, ma è un compito molto semplice.


1
Mi piacerebbe vedere il caso in cui si filtra una query unendosi a una tabella di date con le date memorizzate come numeriche e filtrando quelle date numeriche batterebbe usando "dove [data] tra @startdate e @enddate"
DForck42

1
@ DForck42 non è necessario per il caso che stai suggerendo: "dove [dateAsInt] tra 20120229 e 20120329" restituirebbe esattamente le stesse righe di "dove [data] tra" 20120229 "e" 20120329 ""
AK

3
E quale era il suo ragionamento?
HLGEM,

5

Potenziali tipi di dati e loro dimensioni / limitazioni:

  • Decimale (8,0): 5 byte
  • Data: 3 byte, da 0001-01-01 a 9999-12-31
  • Int: 4 byte

Pro per tipo di dati numerico:

  • Sembrano carini?

Contro per tipo di dati numerico:

  • Richiede un codice personalizzato per la gestione delle operazioni relative alla data
  • Richiede un codice personalizzato per gestire le date corrette (ovvero, non consentire 20120230 [30 febbraio 2012])
  • Ingombro dei dati maggiore rispetto al tipo di dati Data.

Onestamente, stai meglio usando il tipo di dati data IMHO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.