我有一个需要存储年份范围(例如寿命)的数据库,在某些情况下,这些数据库不是非常具体。例如,和通常的'1960'一样,我们有'c。 1960年代为“大约1960年代”,1960年代代表1960年代,以及“nd”代表没有任何日期,这与迄今为止的NULL明显不同。
存储这些产品的最佳方式是什么?
我在考虑将年份存储为字符串,并将“s”存储数十年,将“c”存储为大约,“nd”表示没有日期......但这感觉错了。此外,按时间顺序排序时,我需要在c之前插入20世纪60年代的项目进行排序。 1960年的项目,而1960年的项目之前。
我该如何正确地做到这一点?
一些示例日期范围:
1957
C。 1957年
C。 1957 - 1965年
C。 1957 - 1960年代
C。 1957年至今
C。 1957年 - nd
感谢您的帮助!
答案 0 :(得分:9)
您可以为该范围插入最早和最晚的日期。
就像,确切的日期将是
Jan 1, 1960 Jan 1, 1960
,c。 1960年将是
Jan 1, 1960 Dec 31, 1960
,20世纪60年代将是
Jan 1, 1960 Dec 31, 1969
等
然后你可以在第一个约会和约会时订购:
SELECT *
FROM mytable
ORDER BY
start_date, DATEDIFF(end_date, start_date) DESC
或者,您可以存储期望值和偏差,而不是起始日期和结束日期。
答案 1 :(得分:1)
这听起来像是一个“模糊逻辑”类型的问题。我会通过使用多列来解决它:
您的示例可能表示为
我假设'c'表示+/- 2年,十年从'0到'9,而9999是'nd'的标志值
有用吗?
答案 2 :(得分:0)
我认为Quassnoi的回答是好的,你可以generate a time dimension 然后以类似的方式引用它(虽然你的维度可能不需要那么多行)?
答案 3 :(得分:0)
您需要预先确定您的大约结构是什么或允许多样性。大约通常与文物(书籍,照片,文字)和其他实体(未知的确切出生/死亡日期)的分类相关联,其中可能发现广泛的变化。请记住,随着获取更多信息,通常会对工件进行重新分类。因此,Max已定义了工作,但我还要添加一个有决定性的分类日期,也许还有一个列,其中包含定义分类的分类器/实体的描述和/或名称。您可以确定是否需要重新分类的历史记录以及如何处理。
关于这种性质的另外一个注意事项 - 定义了一天的实际日期的日历,例如日期10月4日(朱利安)之后的日期10月15日(格里高利安),这是一个变化在1582年制造,1751年的类似变化将英国及其当时的殖民地改为格里高利历。因此,您需要确定可以转换为当前日历的日历。
关键在于,你可能还需要一个与决定有关的日历标识符并引用它。
此外,某些事件与表示为“第一个月,第二个月等”的月份相关联。这可能令人困惑,例如贵格会改变了1751年“第一个月”是3月,但是在1752年是1月 - 尤其是家谱是主题(如你暗示的那样)和出生/死亡是事件。
为了好玩,折腾Caeser和Calends(3月的第一天)和他的闰年/日改革,2月24日是闰日,“Calends之前的第6天”,所以2月24日有两个(两个)闰年的第6天。
我指出这一点,因为在某些情况下,闰年的天数可能会改变您的期间。
所以,使用像Max和/或Quassnoi这样的结构建议,但可能会有更多用于删除。
日历和理解的引用:What is a calendar
答案 4 :(得分:0)
“如何存储(和排序)模糊的日期范围?”
(A)让我们用高于平均水平的审查来分析日期范围意味着什么。这意味着该范围有一个精确的开始日期和精确的结束日期。
(B)让我们用高于平均水平的审查来分析它可能意味着什么是“模糊”的日期范围。对我来说,这似乎是某种日期范围,其中开始日期或结束日期或两者都不是精确已知的,但其中一个(或两个) THEMSELVES 范围。
(C)众所周知,“排序”(又名“总秩序”)的通常数学概念并不适用于“范围”的概念(你如何判定1-3更大)或小于0-6?)。 IS 理论上可以基于例如定义这样的排序。 “首先在开始日期订购,在相同的开始日期,在结束日期订购”,但这样的排序永远不会有用。
(D)如果一个范围的“开始日期”和/或“结束日期”本身“模糊”(即那些组成部分本身就是范围),那么很明显为什么尝试和有意义的命令是疯了这样的范围。
所以“(和排序)”部分的答案是:“你没有,因为你不能(以有意义的方式)”。