不完全日期的策略

在我们希望用户能够输入不完整日期的应用程序上工作。

在某些情况下,只有一年 – 比如1854年,或者可能有一年零一个月,例如1983年3月,或者可能有一个完整的日期 – 2001年6月11日。

我们想要一个“日期”属性/列 – 并且能够按日期排序。

有什么建议?

将日期存储为整数 – yyyymmdd。

然后,您可以将尚未输入的任何月份或日期组件归零

Year only: 1954 => 19540000 Year & Month: April 2004 => 20040400 January 1st, 2011 => 20110101 

当然,我假设您不需要存储任何时间信息。

然后,您可以创建一个结构来封装此逻辑,并使用有用的属性指示已设置的粒度级别,相关的System.DateTime等

编辑:排序应该很好地工作

我想不出使用单个日期字段的好方法。

如果您将1月用作默认月份,而将1作为默认日期,则会遇到一个问题,就像其他人建议的那样,当他们实际选择1月时会发生什么? 如果它是一个选定的一月或一个默认的一月你将如何跟踪。

我想你将不得不存放一个面具和日期。 每个部分的日期只需要一点,这只是6位数据。

M | d | Y | H |民| S

月仅1 | 0 | 0 | 0 | 0 | 0 = 32

年仅0 | 0 | 1 | 0 | 0 | 0 = 8

月+年1 | 0 | 1 | 0 | 0 | 0 = 40

AllButMinSec 1 | 1 | 1 | 1 | 0 | 0 = 60

您可以将其放入Flag Enum中,以便在代码中更容易使用。

好吧,你可以通过一个名为’IsDateComplete’的列和字段来完成。

如果您只有日期字段,那么您需要在日期格式中对“不完整性”进行编码,这样如果日期是<1900,则认为它是“不完整”。

就个人而言,我会选择旁边的场地,这样就可以了。 更容易理解,更容易做出决定,并允许任何日期。

也许,不用说,你可以从DateTime.MinValue创建一个日期,然后设置你“知道”的东西。

当然,我的方法不允许你“知道”你不知道的东西。 (也就是说,你不知道他们已经设定了月份)。 您也许可以使用日期格式说明符来屏蔽它,并将其存储在一起,但它可能会变得很麻烦。

无论如何,有些想法适合你。

一种选择是使用1月作为默认月份,1作为默认日期,使用1900或类似作为默认年份。 不完整的日期将使用这些默认值填充,不完整的日期将在同一年的完整日期之前排序。

另一个稍微复杂的选项是使用-1表示默认的日期和年份,-1表示“NoMonth”,或者一些例如默认月份。 填写不完整的日期如上。 根据您的操作方式,这可能会使排序变得有点困难,但它可以让您了解日期的哪些部分有效。

我知道你宁愿拥有一列,但是,不是一列,而是一天,每年和每年都可以有一个单独的列。 对查询进行查询并不困难,而且任何组件都是null。

在日期时间本身编码这些状态的Smehow将更难查询。

我上次解决这个问题时所做的是创建一个自定义日期类型,跟踪实际设置的日期部分,并提供与DateTime之间的转换。 为了存储在数据库中,我使用了一个日期字段,然后使用一个布尔/位来跟踪用户实际设置的日期组件。