我正在设计一个用于Ruby on Rails应用程序的数据库。对于给定的对象,我需要以Gregorian格式和Hebrew calendar等效格式访问事件的日期。我可以轻松地在两种格式之间进行转换,但问题是在希伯来日历中,日期在日落时更改,而不是午夜。因此,我需要存储两个单独的日期,或者存储一个格里高利日期和一个单独的布尔字段after_sunset
。然后,每当我需要访问希伯来语日期时,我都需要查询这两个字段,转换日期,如果after_sunset==true
,则增加日期。
哪些选项被认为是“更好”?
而且,如果我单独存储希伯来语日期,最好将其存储为字符串,整数,还是可以使用常规日期?
答案 0 :(得分:1)
使用after_sunset标志,您可以存储公历日期并添加了解希伯来日期所需的所有其他信息。
有两个日期,你会明确地存储这两个日期。但是,要使数据保持一致,您需要安装检查约束以确保日期匹配。这是因为这两个日期共享部分信息(冗余)。这意味着数据未标准化。
出于这个原因,要在数据库中规范化数据(因此不必安装检查约束以保持数据一致),第一种方法更好。存储日期加上日落后标记。
答案 1 :(得分:0)
以UTC格式存储日期,并以unix格式存储 您可以根据类型使用转换功能 这将允许您的数据库在将来轻松支持其他日期时间格式
答案 2 :(得分:0)
除非你回到时间的早晨,否则我认为我只需要一个多年的UTC日期和希伯来日期查找表,其中UTC列是特定时区希伯来日的第一秒(格林威治?)。
转化是一种快速二元搜索,
SELECT hebrew_date FROM hebrew_gregorian_lookup
WHERE some_input_time >= gregorian_cutoff
ORDER BY gregorian_cutoff DESC LIMIT 1;
如果您在gregorian_cutoff
上对查找表进行索引和聚类,它应该非常快,即使是100年。 (如果您的RDBMS有办法强制表进入RAM,甚至更好。)另外,根据您的RDBMS,您可以将其包装在函数/过程中而不会降低效率。
我建议将希伯来日期不是作为字符串存储,而是作为三个短片,日,月,年的记录存储。您可以使用一个小的查找表来表示字符串,或者使用枚举。这将为您提供格式化方面的灵活性,例如输出中的希伯来字符与拉丁语。