1

我有五个 .NET 类和相应的 SQL Server 表,每个表都有一个开始和结束日期,我可能必须存储具有不同程度特异性的日期,例如 2005、04/2005 或 04/01/ 2005 年。也就是说,我可能必须存储日、月和年;月份和年份;或者只是一年。

最好的方法是什么?我将要使用的方式(由于时间限制)是为我的应用程序添加一个枚举以获取特定性,为每个类/表添加一个列/属性以获取特定性,并将值存储为最早的日期值,例如,如果用户提供 04/2005,则为 04/01/2005。我正在使用 NHibernate,但我的问题主要是关于数据库的。

我想知道,因为我确信我必须再次这样做,并且我想要一个更好的解决方案,也许是使用 CLR 用户定义类型的东西?

谢谢!

编辑:我最终做了一些更像在所选答案中的事情。

4

2 回答 2

1

拥有三个数据类型为 SMALLINT 的可空列用于年份和 TINYINT 用于月份和日期似乎是最简单的解决方案。如果你需要一个索引,你可以把它放在 Year ASC、Month ASC、Day ASC 上。您可以使用 SQL Server 的 DATEPART 函数将日期值转换为您的值。

您可以通过如下查询获得此特殊日期的类型:

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

您可以将这一切包装在 CLR 数据类型中,但我不确定这是否值得。

于 2013-04-24T14:14:26.157 回答
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);
}
于 2013-04-24T14:57:27.090 回答