2011-10-08 14 views
3

我正在使用SQL Server 2008.如何將smalldatetime分解爲年,月,日索引?

我在我的數據庫中有一些日期,我「想」我想分解成更小的部分。日期是生日和死亡日期。我希望能夠通過查詢出生於10月或5月12日或1945年的人來輸出它們。

我被告知,這樣做的一種典型方法是將日期分成較小的碎片並把每件之日起變成自己的一列,例如:

2001-03-12 00:00:00 // EventDate column 

添加這些列:

2001 // EventYear column 
03 // EventMonth column 
12 // EventDay column 

首先,這是這樣做的好辦法嗎?如果是這樣,第二,我可以以某種方式讓SQL Server自動打破日期部分並將其放入自己的列中?

我很欣賞想法和解決方案。

+0

您在該表中有多少行數據? –

+0

最多有10,000個最大行分佈在四到六個表格中。我真的想學習「正確」的方式來做到這一點。我不打算讓它以任何方式完成它。我已經可以做到四五種「錯誤」的方式。我想知道專家如何做到這一點。 –

+0

你是什麼意思傳播4-6表? –

回答

5

我建議您將它作爲日期列,然後在查詢中使用DatePart來過濾結果。

Select * from TABLEX 
where DatePart(YEAR,EventDate) = 1945 
+0

查詢時間爲5月12日時,這將如何執行? –

+0

這是處理日期時間列操作的正確方法。將日期複製到多個列中是沒有意義的,除非您正在談論擁有數百萬條記錄並且性能非常重要的數據庫。此功能成本低,應該表現良好。 –

+2

我當然不會有數百萬個日期,可能只有幾千個。我想這樣做,好像有一百萬日期。我更願意在Date = 1945年的DateTable中寫select *這樣的查詢,而不是每個查詢中的日期部分。 –

4

這聽起來不像商業需求是非常固化。出於什麼原因,你需要打破日期的不同部分?如果你不需要,那麼我不會。

但是,如果你確實需要做到這一點,那麼我會利用持久化的計算列。在插入上會有一些開銷,但是因爲現有數據不會有任何更新(您的出生日期和死亡日期不會改變),您將不會在SELECT上看到任何性能開銷。

事情是這樣的:

create table DateTest 
(
    SomeDate datetime not null, 
    SomeYear as datepart(yy, somedate) persisted, 
    SomeMonth as datepart(mm, somedate) persisted, 
    SomeDay as datepart(dd, somedate) persisted 
) 
+2

用於計算列的+1,但不要忘記添加索引,否則您將使用列進行表掃描。並且年度計算的列並不是真的有必要。您可以直接使用日期列。 –

+0

有趣的解決方案。這超出了我的經驗水平,但我會研究並記住它。謝謝! –

4

這是我做的。

我有一個表「lib.Dates」。它有一個DATE作爲主鍵。

它還有附加列,包含此日期的其他信息。例如,這是一個月中的某一天,一天的月份,一週中的某一天等。

加入此日期表並將其與日期相結合,可讓我: *獲取所有日期的列表(例如按日期分組銷售人員將無法進入零銷售,這樣它可以有) *做一些有趣的事情,比如一年中的第23周的所有日期,通常很難得到。

這是我存儲過程每天保存(-3年,+ 5年)的許多這樣的表格的一部分。

+0

你的意思是一個'日曆'表,其他所有帶有'日期'字段的表都可以引用它作爲'FOREIGN KEY'?那麼,沒有其他表需要持久的索引視圖?如果是,則從我+1。 –

+0

是的,確切地說。它也屬於我維護的一個圖書館項目 - 我有時在這裏添加新的表格。特別是這個連接事物有時非常好(因爲它使我對所有日期列表,不僅僅是有數據的日期)。 – TomTom

+0

是的,類似的問題不時出現在SO中,「找到所有沒有下訂單的日期」。 –

相關問題