Tarihi tamsayı (sayısal) olarak saklama, avantajları nelerdir?


11

Soru 1

Tarihin tamsayı (gerçek sayısal (8,0)) olarak saklandığı bir sistemle çalışıyorum ve diğer sistemlerin de tarihi bu iş parçacığında cisco gibi int olarak sakladığını fark ettim . Misal

20120101  -- 01 Jan 2012

SQL Tarih saatini kullanmamanın sayısal tarih sistemini korumanın bir avantajı var mı?

soru 2

Şimdi iki tarih arasında müşteri bulmak için sayısal tarih üzerinden döngü çalışıyorum. Eğer startve enddatekapsayacak iki ay yerine sadece 60 Örnek binlerce kayıt olsun:

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

Bu, 60 yerine 8931 kaydı çeker. Yukarıdaki mantığı geliştirmenin daha iyi bir yolu var mı, bu yüzden yalnızca geçerli tarihleri ​​çekiyorum? IsDate ve alt sorguları denedim ama bu verimli bir şekilde çalışmadı.


SQL Server 2008 veya üstünü çalıştırıyorsanız, aslında Tarih veri türünü kullanabilirsiniz. Biraz daha küçüktür ve sizi zaman eklemeye zorlamaz, ancak SQL'in datetime işlevlerinin neredeyse tamamı hala bunun için çalışır.
DForck42

2
Bu yaklaşımdaki dezavantajları sadece hiçbir avantaj
görmüyorum

Yanıtlar:


11

İlk sorunuzu cevaplamak için DATETIMESQL Server içindeki veri türünü kullanmanızı tavsiye ederim . Performans nedenleriyle değil, RDBMS'ye özgü işlevlerden yararlanmak için gerekli değildir. Örneğin, sadece temel tarih matematik yapmak mantık çok yeniden icat etmek zorunda (düşünürdüm DATEDIFF(), DATEADD(), DATEPART()ve diğer birçok fonksiyonlar. Onlar belli uyarlanır DATETIMEveri tipi ve çalışmak kolaydır).

İkinci sorunuza gelince , ilk sorunun (ve benim cevabımın) yöneldiği problemin tam karşılığını alıyorsunuz . Sen tarihleri gibi 20111201 ve 20120131 bakıyoruz ve beynin 60 günlük bir fark olması gerektiğini anlatıyor. Şey, deltadan yola çıkarak geçiyorsunuz ... ki:

20120131 - 20111201 = 8930 (kapsayıcı döngü ile 8931 olacak)

Başka bir deyişle, WHILEdöngünüz 8931 kez yürütülüyor. Bunun nedeni tamsayı değerler olması ve döngünüzün 20111231'den 20120101'e atlamamasıdır.

Tamsayıların yıllar ve aylar sınırlarını dikkate almayacaksınız (yani Soru 2 probleminiz).


Bu tam olarak sorum. Sayısal tarihler için, döngüler sadece 30 gün veya 29 gün değil, binlerce olabilir. Ancak profesyonel bir sistemle çalıştığımı unutmayın . Ve cisco bile göründüğü gibi kullanıyor.
Jackofall

4
Performans ve işlevselliğin yanı sıra bütünlük de vardır. Tarihleri gibi tamsayılar ile db sağlayacak 20121301ve 20120230hatta 20129999tarih olarak.
ypercubeᵀᴹ

@Jackofall Cisco'nun arkasında bir RDBMS platformu yok. Kendi mantıklarını yazdılar. Neden olmaz onlar sadece tamsayılar kullanırlar. Baştan sona, bu muhtemelen düşük seviyeli yazılım için en kolay yoldur. Ama burada elma ve portakaldan bahsediyoruz.
Thomas Stringer

3
@Jackofall: Tarihleri ​​tamsayı olarak saklamak (ve boşluklara sahip olmak) ve tarih / zaman damgasını tamsayı olarak saklamak, hatta VB / Excel gibi tamsayı olarak tarihler arasında büyük bir fark vardır.
ypercubeᵀᴹ

4
Kötü teknikler kullanan birçok profesyonel olarak tasarlanmış veritabanı vardır. Birçok COTS ürünü ile çalıştım ve bir veritabanı bakış açısından iyi dezenfekte edilmiş herhangi bir ürün görmedim.
HLGEM

6
  1. Ralph Kimball, tarihleri ​​tamsayı olarak saklamanızı önerir. Hem çevrimiçi makaleler hem de kitaplar çok şey yazdı.
  2. Bir takvim tablosu kullanabilir ve tarihlerinize aşağıdaki gibi ardışık sayılar verebilirsiniz:

    Tarih Numarası

    20120229 1234

    20120301 1235

Takvim tablosu oluşturulmalıdır, ancak bu çok kolay bir iştir.


1
Sayısal olarak depolanan tarihleri ​​içeren bir tarih tablosuna katılarak ve bu sayısal tarihleri ​​filtreleyerek bir sorguyu filtrelediğinizi görmek istiyorum, "nerede [tarih] @startdate ile @enddate arasında"
geçiyordu

1
@ DForck42 önerdiğiniz davaya gerek yok: "20120229 ile 20120329 arasında [dateAsInt]", "20120229" ile "20120329" arasında [date] ile aynı satırları döndürür "
AK

3
Ve onun mantığı neydi?
HLGEM

5

Potansiyel veri türleri ve boyutları / sınırlamaları:

  • Ondalık (8,0): 5 bayt
  • Tarih: 3 bayt, 0001-01-01 - 9999-12-31
  • Int: 4 bayt

Sayısal veri türü için artıları:

  • Güzel görünüyorlar mı?

Sayısal veri türü için eksileri:

  • Tarih işlemlerini işlemek için özel kod gerektirir
  • Doğru tarihleri ​​yönetmek için özel kod gerektirir (ör. 20120230'a izin vermiyor [30 Şub 2012])
  • Tarih veri türü ile karşılaştırıldığında daha büyük veri alanı.

Dürüst olmak gerekirse, IMHO tarih veri türünü kullanmanız daha iyi olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.