3

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

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

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

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

4

11 回答 11

9

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

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

于 2008-09-18T05:34:55.143 回答
3

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

于 2008-09-18T05:20:21.903 回答
2

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

1 = 日 2 = 月 4 = 年

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

于 2008-09-18T05:25:41.813 回答
2

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

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

于 2008-09-18T05:51:26.947 回答
0

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

于 2008-09-18T05:23:35.140 回答
0

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

于 2008-09-18T05:24:40.037 回答
0

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

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

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

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

于 2008-09-18T05:28:12.617 回答
0

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

于 2008-09-18T05:37:17.150 回答
0

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

于 2008-09-18T05:37:33.937 回答
0

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

于 2008-09-18T05:38:53.403 回答
0

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

于 2012-05-26T20:25:33.787 回答