我将如何存储可以是部分日期的日期(即也可以是年份,也可以是月份),然后以相同的专一性输出呢?
我想让用户指定一个日期,该日期可以包含也可以不包含日期和月份(但至少包含年份)。缺少的日期/月份将保存为默认值,而我将失去原始格式和日期含义。
我的想法是将实际格式除了datetime列之外,还以字符串形式存储在列中。然后,只要需要显示其他所有内容的日期和日期时间,就可以使用字符串列。缺点是我要显示的表中每个日期列都有一个额外的列,由于我不能依赖datetime值,因此打印本地化日期将变得不那么容易...我可能不得不解析字符串。
我希望我已经忽略了某些东西,并且可能会有一种更简单的方法。
(请注意,如果解决方案很重要,我将使用Rails。)
解决方案
在模型中,只注意我们关心的零件。因此,我们可以将整个日期存储在数据库中,但是在将其显示给用户之前可以将其合并。
是否真的有必要将其存储为日期时间?如果未将其存储为字符串,则在将其拔出时,2008或者2008-8或者2008-8-1会在连字符上分割该字符串,并能够确定原始输入的具体程度
我可能会存储datetime和一个添加的" precision"列,以确定如何输出它。对于输出,精度列可以映射到包含相应格式字符串(" YYYY-mm"等)的列,也可以包含格式字符串本身。
添加列可以简单地用于指定已指定日期时间的哪一部分
1 =天
2 =月
4 =年
所以3是日和月,6是月和年,7是所有三个。这是一个简单的诠释
我对数据库设计并不了解很多,但是我认为一种干净的方法是使用布尔列来指示用户是否输入了月份和日期(每个列一个月)。然后,要保存给定的日期,我们将:
- 将用户输入的日期存储在datetime列中;
- 如果用户选择了一个月,则设置布尔月列;
- 如果用户选择了一天,则设置布尔日列。
通过这种方式,我们可以知道日期时间的哪些部分(即用户输入的内容)。
编辑:它也比具有带有隐含值的int
字段更容易理解!
根据Jhenzie的建议,创建一个位掩码以显示已指定日期的哪些部分。 1 =年,2 =月,4 =日,8 =小时(如果我们决定更具体),然后将其存储到另一个字段中。
我可以想到而无需在表中添加额外列的唯一方法是使用jhenzie的使用位掩码的方法,然后将该位掩码存储到datetime列的秒部分。
notifyix数据库具有此功能。定义日期字段时,还可以指定所需时间和日期属性的掩码。比较时仅这些字段计数。
具有不同级别的特异性,最好的选择是将它们存储为简单的可为null的int。年月日。我们可以将显示逻辑封装在表示模型中,也可以封装在域中的值对象中。
内置时间类型表示时间的瞬间。我们可以使用内置类型并为精度(年,月,日,小时等)创建一列,也可以创建自己的日期结构,并为空部分使用空值(或者其他无效值)。
如果我们存储字符串,请不要部分地重新发明ISO 8601标准,该标准涵盖了我们描述的情况以及更多:
http://en.wikipedia.org/wiki/ISO_8601