Menyimpan tanggal sebagai integer (numerik), apa kelebihannya


11

pertanyaan 1

Saya bekerja dengan sistem di mana tanggal disimpan sebagai integer (angka aktual (8,0)) dan saya perhatikan bahwa sistem lain juga menyimpan tanggal sebagai int seperti cisco di utas ini . Contoh

20120101  -- 01 Jan 2012

Apakah ada keuntungan menjaga sistem tanggal numerik dan tidak menggunakan SQL Datetime?

Pertanyaan 2

Sekarang saya mencoba untuk mengulangi tanggal numerik untuk menemukan pelanggan di antara dua tanggal. Jika startdan enddatemencakup dua bulan, saya mendapatkan ribuan catatan, bukan hanya 60. Contoh:

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

Ini menarik 8931 catatan, bukan 60. Apakah ada cara yang lebih baik untuk meningkatkan logika di atas jadi saya hanya menarik tanggal yang valid? Saya mencoba IsDate dan sub-kueri tetapi itu tidak cukup efisien.


Jika Anda menjalankan SQL Server 2008 atau lebih tinggi, Anda sebenarnya bisa menggunakan tipe data Date. Ini sedikit lebih kecil dan tidak memaksa Anda untuk memasukkan waktu, tetapi hampir semua fungsi datetime SQL masih bekerja untuk itu.
DForck42

2
Saya hanya melihat kelemahan dalam pendekatan ini tidak ada keuntungan sama sekali
a_horse_with_no_name

Jawaban:


11

Untuk menjawab pertanyaan pertama Anda, saya akan merekomendasikan menggunakan DATETIMEtipe data dalam SQL Server. Tidak harus karena alasan kinerja, tetapi untuk memanfaatkan fungsionalitas khusus RDBMS. Misalnya, Anda harus menemukan kembali banyak logika hanya untuk melakukan tanggal dasar matematika (berpikir DATEDIFF(), DATEADD(), DATEPART()dan banyak fungsi lainnya. Mereka jelas disesuaikan dengan DATETIMEtipe data dan mudah untuk bekerja dengan).

Adapun pertanyaan kedua Anda , Anda mengalami masalah yang tepat bahwa pertanyaan pertama (dan jawaban saya) diarahkan . Anda melihat 20111201 dan 20120131 sebagai tanggal, dan otak Anda memberi tahu Anda bahwa perbedaannya adalah 60 hari. Nah, Anda mengulangi berdasarkan dari delta ... yaitu:

20120131 - 20111201 = 8930 (dengan loop inklusif akan menjadi 8931)

Dengan kata lain, WHILEloop Anda mengeksekusi 8931 kali. Ini terjadi karena itu adalah nilai integer dan loop Anda tidak akan melompat dari 20111231 langsung ke 20120101.

Anda bilangan bulat tidak akan memperhitungkan batas tahun dan bulan (yaitu masalah Pertanyaan 2 Anda ).


Ya, itulah pertanyaan saya. Untuk tanggal numerik, loop dapat mencapai ribuan, bukan hanya 30 hari atau 29 hari. Tetapi ingatlah bahwa saya bekerja dengan sistem profesional . Dan bahkan cisco menggunakannya seperti yang terlihat.
Jackofall

4
Selain kinerja dan fungsionalitas, ada juga integritas. Dengan bilangan bulat sebagai tanggal, db akan mengizinkan 20121301dan 20120230dan bahkan 20129999sebagai tanggal.
ypercubeᵀᴹ

@Jackofall Cisco tidak memiliki platform RDBMS di belakangnya. Mereka menulis logika mereka sendiri. Mengapa mereka tidak menggunakan bilangan bulat saja. Dari bawah ke atas, itu mungkin cara termudah untuk perangkat lunak tingkat rendah. Tapi kita berbicara tentang apel dan jeruk di sini.
Thomas Stringer

3
@Jackofall: Ada perbedaan besar antara menyimpan tanggal sebagai integer (dan memiliki celah) dan menyimpan datetimes / cap waktu sebagai integer - atau bahkan tanggal sebagai integer, seperti yang dilakukan VB / Excel.
ypercubeᵀᴹ

4
Ada banyak (jika tidak sebagian besar) database yang dirancang secara profesional yang menggunakan teknik buruk. Saya telah bekerja dengan banyak produk COTS dan tidak melihat produk apa pun yang dirancang dengan baik dari perspektif basis data.
HLGEM

6
  1. Ralph Kimball merekomendasikan menyimpan tanggal sebagai bilangan bulat. Ia telah banyak menulis, baik artikel dan buku online.
  2. Anda dapat menggunakan tabel kalender dan mengeluarkan nomor berurutan untuk tanggal Anda, sebagai berikut:

    Nomor Tanggal

    20120229 1234

    20120301 1235

Tabel kalender harus dibuat, tetapi itu adalah tugas yang sangat mudah.


1
Saya ingin melihat kasus di mana Anda memfilter kueri dengan bergabung ke tabel tanggal dengan tanggal disimpan sebagai numerik dan memfilter tanggal numerik itu akan mengalahkan menggunakan "di mana [tanggal] antara @startdate dan @enddate"
DForck42

1
@ DForck42 tidak perlu untuk kasus yang Anda sarankan: "di mana [dateAsInt] antara 20120229 dan 20120329" akan mengembalikan baris yang persis sama dengan "di mana [tanggal] antara '20120229' dan '20120329'"
AK

3
Dan apa alasannya?
HLGEM

5

Jenis data potensial dan ukuran / batasannya:

  • Desimal (8,0): 5 byte
  • Tanggal: 3 byte, 0001-01-01 hingga 9999-12-31
  • Int: 4 byte

Kelebihan untuk tipe data numerik:

  • Mereka terlihat cantik?

Kekurangan untuk tipe data numerik:

  • Membutuhkan kode khusus untuk menangani operasi tanggal
  • Memerlukan kode khusus untuk mengelola tanggal yang benar (yaitu, tidak mengizinkan 20120230 [30 Feb 2012])
  • Jejak data lebih besar bila dibandingkan dengan tipe data Date.

Jujur, Anda lebih baik menggunakan IMHO tipe data tanggal.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.