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 start
dan enddate
mencakup 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.
sql-server
sql-server-2008
date-format
Jackofall
sumber
sumber
Jawaban:
Untuk menjawab pertanyaan pertama Anda, saya akan merekomendasikan menggunakan
DATETIME
tipe 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 (berpikirDATEDIFF()
,DATEADD()
,DATEPART()
dan banyak fungsi lainnya. Mereka jelas disesuaikan denganDATETIME
tipe 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,
WHILE
loop 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 ).
sumber
20121301
dan20120230
dan bahkan20129999
sebagai tanggal.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.
sumber
Jenis data potensial dan ukuran / batasannya:
Kelebihan untuk tipe data numerik:
Kekurangan untuk tipe data numerik:
Jujur, Anda lebih baik menggunakan IMHO tipe data tanggal.
sumber