【问题标题】:Store Hebrew Dates in a SQL Database在 SQL 数据库中存储希伯来日期
【发布时间】:2014-09-16 23:27:16
【问题描述】:

我正在设计一个用于 Ruby on Rails 应用程序的数据库。对于给定的对象,我需要以Gregorian 格式和Hebrew calendar 等效格式访问事件的日期。我可以轻松地在这两种格式之间进行转换,但问题是在希伯来日历中,日期在日落时更改,而不是午夜。因此,我需要存储两个单独的日期,或者存储一个公历日期和一个单独的布尔字段after_sunset。然后,每当我需要访问希伯来日期时,我都需要查询这两个字段,转换日期,如果是after_sunset==true,则增加日期。

哪些选项被认为“更好”?

如果我单独存储希伯来日期,最好将其存储为字符串、整数,还是可以使用常规日期?

【问题讨论】:

  • 所以对于每个事件,您都知道日期以及它是在日落之前还是之后,但不知道确切的时间或时间跨度?
  • 是的,没错。

标签: sql ruby-on-rails date database-design


【解决方案1】:

使用 after_sunset 标志,您可以存储公历日期并添加了解希伯来日期所需的所有其他信息。

使用两个日期,您可以明确存储这两个日期。但是,要使数据保持一致,您将安装检查约束以确保日期匹配。这是因为这两个日期共享部分信息(冗余)。这意味着数据未标准化。

因此,要在数据库中规范化数据(因此不必安装检查约束来保持数据一致),第一种方法更好。存储日期和日落后标志。

【讨论】:

    【解决方案2】:

    以 UTC 格式存储日期并以 unix 格式存储 您可以使用基于类型的转换功能 这将使您的数据库将来可以轻松支持其他日期时间格式

    【讨论】:

    • 我不需要任何其他日历类型。
    【解决方案3】:

    除非您要回到时间的黎明,否则我想我只会有一个 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,您可以将其包装在函数/过程中而不会降低效率。

    我建议不要将希伯来日期存储为字符串,而是将其存储为三个简短的记录,即日、月、年。您可以有一个小的查找表来查找月份字符串,或者使用枚举。这将为您提供一些格式的灵活性,例如输出中的希伯来字符与拉丁字符。

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2016-03-11
      • 2017-05-31
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多