2013-04-24 48 views
1

我有五個.NET類和相應的SQL Server表,每個表都有一個開始日期和結束日期,我可能不得不存儲具有不同程度特異性的日期,例如2005年04月05日或2005年4月1日。也就是說,我可能必須存儲日,月和年;月份和年份;或僅僅是一年。假設:在SQL Server中爲.NET MVC應用程序存儲具有不同特徵的日期時間數據

這樣做的最好方法是什麼?我將要使用的方式(由於時間限制)是向我的應用程序中添加一個枚舉以獲得特定性,爲每個類/表添加特定的列/屬性,並將該值作爲最早的日期存儲在值,例如,如果用戶提供04/2005,則2005年1月4日。我使用的是NHibernate,但對我來說問題主要是關於數據庫。

我想知道,因爲我確信我將不得不再次這樣做,我想有一個更好的解決方案,可能是使用CLR用戶定義類型的東西?

謝謝!

編輯:我最終做了一些更像在選定的答案。

回答

1

當年有三個數據類型爲SMALLINT的可空列和TINYINT在月和日似乎是最簡單的解決方案。如果你需要一個索引,你可以把它放在年ASC,月ASC,日ASC。您可以使用SQL Servers DATEPART函數將日期值轉換爲您的值。

的類型,你可以用這樣的查詢得到這個特殊的日子:

SELECT CASE WHEN Month IS NULL THEN 'YearOnly' 
      WHEN Day IS NULL THEN 'YearMonth' 
      ELSE 'FullDate' 
     END AS SpecialDateType 
    FROM dbo.yourtable; 

你可以把這個包都在一個CLR數據類型,但我不知道這是值得的。

+0

感謝您的回覆。我最終做了類似於這個的地方,但是我沒有使用特異性指標,而是使用計算列進行排序,如果有月份,則假設第一個1月1日,如果沒有第一個月,天。我的問題的真實部分是關於三個單獨的部分,我喜歡你的方式比我最初的建議更好。 – 2013-04-26 14:39:42

0

我認爲將值存儲爲日期是有道理的,因爲它會使查詢變得簡單。我不認爲需要一個枚舉來聲明特殊性。我將通過公共getter/setter對具有後臺字段和控制分辨率的屬性建模:

private DateTime _theDate; 

public DateTime TheDate 
{ 
    get { return _theDate; } 
    set { _theDate = new DateTime(value.Year, value.Month, 1); } 
    // or use a utility class _theDate = DateUtils.MonthResolution(value); 
} 
+0

謝謝你的答覆,傑米。 – 2013-04-26 14:36:34

相關問題