我如何存储一个可以是部分的日期(即只是年份,也许也就是月份),并在以后以相同的指定方式输出它?

我想让用户指定一个日期,该日期可能包含也可能不包括日期和月份(但至少会包含年份。)问题是它在数据库中存储为日期时间; 缺失的日期/月将保存为默认值,我将丢失原始格式和日期的含义。

我的想法是除了datetime列之外还将实际格式作为字符串存储在列中。 然后,每当我必须显示其他所有内容的日期和日期时间时,我都可以使用字符串列。 缺点是我要显示的表中每个日期列的额外列,打印本地化日期不会那么容易,因为我不能依赖日期时间值……我可能要解析字符串。

我希望我忽略了一些东西,可能会有一种更简单的方法。

(注意我使用Rails,如果它对解决方案很重要。)

正如Jhenzie所提出的 ,创建一个位掩码来显示指定日期的哪些部分。 1 =年,2 =月,4 =日,8 =小时(如果您决定更具体) ,然后将其存储到另一个字段中。

我想到的唯一方法就是使用jhenzie使用位掩码的方法,然后将该位掩码存储到datetime列的秒部分。

在你的模型中只关注你关心的部分。 因此,您可以将整个日期存储在数据库中,但在将其显示给用户之前将其合并。

附加列可以简单地用于指定指定日期时间的哪个部分

1 =第2天=第4个月=年

所以3是日和月,6是月和年,7是3。 那时它是一个简单的int

如果您存储字符串,请不要部分重新发明涵盖您描述的案例的ISO 8601标准以及更多:

http://en.wikipedia.org/wiki/ISO_8601

是否真的有必要将其存储为日期时间? 如果没有将它存储为字符串2008或2008-8或2008-8-1 – 当您将其拉出时将字符串拆分为连字符,并且您能够确定原始输入的具体程度

我可能会存储日期时间和一个额外的“精确”列来确定如何输出它。 对于输出,精度列可以映射到包含相应格式字符串(“YYYY-mm”等)的列,或者它可以包含格式化字符串本身。

我不太了解数据库设计,但我认为一个干净的方法是使用布尔列来指示用户是否有输入月和日(每列一列)。 然后,为了保存给定日期,您将:

  1. 将用户输入的日期存储在datetime列中;
  2. 如果用户选择了一个月,则设置布尔月份列;
  3. 如果用户选择了一天,则设置布尔日列。

这样您就可以知道可以信任的日期时间的哪些部分(即用户输入的内容)。

编辑:它比使用具有神秘值的int字段更容易理解!

informix数据库具有此function。 定义日期字段时,还要指定所需时间和日期属性的掩码。 进行比较时只计算这些字段。

具有不同的特异性水平,您最好的选择是将它们存储为简单的可为空的整数。 年月日。 您可以将显示逻辑封装在演示模型中或域中的值对象中。

内置时间类型代表即时。 您可以使用内置类型并创建精度列(年,月,日,小时等),也可以创建自己的日期结构,并为空部分使用空值(或其他无效值)。

对于ruby至少 – 你可以使用这个gem – 部分日期https://github.com/58bits/partial-date