การจัดเก็บวันที่เป็นจำนวนเต็ม (ตัวเลข) ข้อดีคืออะไร


11

คำถามที่ 1

ฉันกำลังทำงานกับระบบที่เก็บวันที่เป็นจำนวนเต็ม (ตัวเลขจริง (8,0)) และฉันสังเกตเห็นว่าระบบอื่น ๆ เก็บวันที่เป็น int เช่นซิสโก้ในหัวข้อนี้ ตัวอย่าง

20120101  -- 01 Jan 2012

มีข้อได้เปรียบอะไรบ้างในการรักษาระบบวันที่เป็นตัวเลขและไม่ได้ใช้ SQL Datetime?

คำถามที่ 2

ตอนนี้ฉันพยายามวนวันที่เป็นตัวเลขเพื่อค้นหาลูกค้าระหว่างสองวัน หากstartและenddateรวมสองเดือนฉันจะได้รับบันทึกนับพันแทนที่จะเป็นเพียง 60 ตัวอย่าง:

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

นี่เป็นการดึง 8931 บันทึกแทนที่จะเป็น 60 มีวิธีที่ดีกว่าในการปรับปรุงตรรกะข้างต้นเพื่อให้ฉันดึงเฉพาะวันที่ที่ถูกต้องหรือไม่ ฉันลองใช้ IsDate และแบบสอบถามย่อย แต่ก็ไม่ได้ผลอย่างมีประสิทธิภาพ


หากคุณใช้ SQL Server 2008 หรือสูงกว่าคุณสามารถใช้วันที่ประเภทข้อมูล มันเล็กไปหน่อยและไม่ได้บังคับให้คุณรวมเวลา แต่ฟังก์ชั่น datetime ของ SQL เกือบทั้งหมดยังใช้งานได้
DForck42

2
ฉันเห็นข้อเสียในแนวทางนี้เท่านั้นไม่มีประโยชน์อะไรเลย
a_horse_with_no_name

คำตอบ:


11

เพื่อตอบคำถามแรกของคุณฉันขอแนะนำให้ใช้DATETIMEชนิดข้อมูลภายใน SQL Server ไม่จำเป็นสำหรับเหตุผลด้านประสิทธิภาพ แต่เพื่อใช้ประโยชน์จากฟังก์ชั่นเฉพาะของ RDBMS ตัวอย่างเช่นคุณจะต้องคิดค้นมากของตรรกะเพียงเพื่อทำคณิตศาสตร์วันขั้นพื้นฐาน (คิดว่าDATEDIFF(), DATEADD(), DATEPART()และฟังก์ชั่นอื่น ๆ อีกมากมาย. พวกเขาได้รับการตกแต่งอย่างเห็นได้ชัดกับDATETIMEชนิดข้อมูลและง่ายต่อการทำงานด้วย)

สำหรับคำถามที่สองของคุณคุณกำลังทำงานเป็นปัญหาแน่นอนว่าคำถามแรก (และคำตอบของฉัน) จะมุ่งสู่ คุณกำลังดูวันที่ 20111201 และ 20120131 เป็นวันที่และสมองของคุณกำลังบอกคุณว่าควรจะแตกต่างจาก 60 วัน คุณกำลังวนลูปจากเดลต้า ... ซึ่งก็คือ:

20120131 - 20111201 = 8930 (ด้วยวงรวมมันจะเป็น 8931)

กล่าวอีกนัยหนึ่งการWHILEวนซ้ำของคุณกำลังดำเนินการ 8931 ครั้ง สิ่งนี้เกิดขึ้นเพราะมีค่าจำนวนเต็มและลูปของคุณจะไม่กระโดดจาก 20111231 ตรงไปที่ 20120101

จำนวนเต็มของคุณจะไม่คำนึงถึงจำนวนปีและเดือน (เช่นปัญหาคำถาม 2ของคุณ)


นั่นคือคำถามของฉัน สำหรับวันที่เป็นตัวเลขลูปสามารถมีได้หลายพันไม่ใช่แค่ 30 วันหรือ 29 วัน แต่จำไว้ว่าฉันกำลังทำงานร่วมกับระบบมืออาชีพ และแม้แต่ซิสโก้ก็ใช้มันอย่างที่คิด
Jackofall

4
นอกจากประสิทธิภาพและการใช้งานแล้วยังมีความสมบูรณ์ ด้วยจำนวนเต็มเป็นวันฐานข้อมูลจะช่วยให้20121301และ20120230และยัง20129999เป็นวันที่
ypercubeᵀᴹ

@Jackofall Cisco ไม่มีแพลตฟอร์มของ RDBMS อยู่ข้างหลัง พวกเขาเขียนตรรกะของตัวเอง ทำไมพวกเขาถึงไม่ใช้จำนวนเต็ม นับว่าเป็นวิธีที่ง่ายที่สุดสำหรับซอฟต์แวร์ระดับล่าง แต่เรากำลังพูดถึงแอปเปิ้ลและส้มที่นี่
Thomas Stringer

3
@ Jackofall: มีความแตกต่างอย่างมากระหว่างการจัดเก็บวันที่เป็นจำนวนเต็ม (และมีช่องว่าง) และการจัดเก็บ datetimes / timestamps เป็นจำนวนเต็ม - หรือแม้กระทั่งวันที่เป็นจำนวนเต็มเช่น VB / Excel ทำ
ypercubeᵀᴹ

4
มีฐานข้อมูลที่ออกแบบอย่างมืออาชีพจำนวนมาก (ถ้าไม่ใช่มากที่สุด) ที่ใช้เทคนิคที่ไม่ดี ฉันทำงานกับผลิตภัณฑ์ COTS จำนวนมากและไม่เห็นสิ่งใดที่ได้รับการพิจารณาอย่างดีจากมุมมองของฐานข้อมูล
HLGEM

6
  1. Ralph Kimball แนะนำให้เก็บวันที่เป็นจำนวนเต็ม เขาเขียนมากทั้งบทความออนไลน์และหนังสือ
  2. คุณสามารถใช้ตารางปฏิทินและออกหมายเลขติดต่อกันตามวันที่ของคุณดังนี้:

    หมายเลขวันที่

    20120229 1234

    20120301 1235

ต้องสร้างตารางปฏิทิน แต่มันเป็นงานที่ง่ายมาก


1
ฉันต้องการดูกรณีที่คุณกรองแบบสอบถามโดยการเข้าร่วมตารางวันที่โดยมีวันที่จัดเก็บเป็นตัวเลขและการกรองวันที่ที่เป็นตัวเลขเหล่านั้นจะชนะโดยใช้ "where [date] ระหว่าง @startdate และ @enddate"
DForck42

1
@ DForck42 ไม่จำเป็นสำหรับกรณีที่คุณกำลังแนะนำ: "โดยที่ [dateAsInt] ระหว่าง 20120229 ถึง 20120329" จะส่งคืนแถวเดียวกันกับ "โดยที่ [date] ระหว่าง '20120229' และ '20120329'"
AK

3
และเหตุผลของเขาคืออะไร?
HLGEM

5

ประเภทข้อมูลที่เป็นไปได้และขนาด / ข้อ จำกัด :

  • ทศนิยม (8,0): 5 ไบต์
  • วันที่: 3 ไบต์, 0001-01-01 ถึง 9999-12-31
  • ภายใน: 4 ไบต์

ข้อดีสำหรับประเภทข้อมูลตัวเลข:

  • พวกเขาดูน่ารักเหรอ?

ข้อเสียสำหรับชนิดข้อมูลที่เป็นตัวเลข:

  • ต้องใช้รหัสที่กำหนดเองสำหรับการจัดการวันที่
  • ต้องใช้รหัสที่กำหนดเองเพื่อจัดการวันที่ที่ถูกต้อง (เช่นไม่อนุญาต 20120230 [30 กุมภาพันธ์ 2012])
  • ปล่อยข้อมูลให้ใหญ่ขึ้นเมื่อเปรียบเทียบกับชนิดข้อมูล Date

สุจริตคุณควรใช้ประเภทข้อมูลวันที่ IMHO

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.