我将如何存储可能是部分的日期(即只是年份,也许还有月份)并稍后以相同的说明输出它?

StackOverflow https://stackoverflow.com/questions/90246

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

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

我希望我忽略了一些事情,并且可能有一种更简单的方法。

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

有帮助吗?

解决方案

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

我能想到的唯一方法 没有 如果需要在表中添加额外的列,则可以使用 jhenzie 的使用位掩码的方法,然后将该位掩码存储到日期时间列的秒部分中。

其他提示

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

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

1 =第2天=月4 =年

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

如果您存储字符串,请不要部分重新发明 ISO 8601 标准,该标准涵盖您描述的情况及更多内容:

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

真的有必要将其存储为日期时间吗?如果未将其存储为字符串 2008 或 2008-8 或 2008-8-1 - 当您将其拉出时,请用连字符拆分字符串,这样您就能够确定原始输入的具体程度

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

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

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

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

编辑:它也比拥有一个更容易理解 int 具有神秘值的字段!

informix 数据库具有此功能。定义日期字段时,您还指定所需时间和日期属性的掩码。进行比较时只有这些字段才有效。

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top