6

所以我有一张桌子。该表中的每个条目都有一个与之关联的日期,它必须:

  • 支持部分日期:1994 年 5 月 2 日、16:45 GMT+42003 年 4 月均有效
  • 具有可比性:我想在特定日期之前或之后查询每个条目(此日期始终是完整的,即精确到秒和时区)。2003 年 4 月应在1994 年 5 月 2 日 16:45 GMT+4之后,日期应按精度排序(即2003 年 4 月* 在2003 年 4 月 3 日之前)。

你将如何解决这个问题?我目前正在使用 Postgres(但不依赖于它),并倾向于一种方法,即int每个日期属性都有一个列,将实际的排序/比较逻辑转移到应用程序中。

有什么有趣的想法吗?

4

2 回答 2

9

您可以使用ISO 8601日期字符串。ISO 日期格式支持您描述的形式的部分日期(但请注意,例如“4 月 23 日”没有年份)。

你的例子是:

  • “1994 年 5 月 2 日 16:45 GMT+4”:1994-05-02T12:45:00Z
  • “2003 年 4 月”:2003-04

您可以将它们作为简单的字符串进行排序和比较,并获得所需的结果。Ie2003-04-03在词汇上是在2003-04.

您可以从最后删除任何级别的精度,它仍然可以工作。您只是不能从开头或中间删除组件。

请注意,您需要将所有时区标准化为 UTC 才能正常工作,如上例所示。

如果您更喜欢在数据库中使用日期/时间戳类型,另一种方法是将日期的精度存储在辅助列中。例如,将“April 2003”存储为日期字段中的时间戳,并在辅助字段中使用标志来指示此日期以“月”精度存储,不应解释为“2003 年 4 月 1 日,上午 12 点”。

于 2013-06-16T12:59:50.730 回答
1

在 PG 数据库中,您存储日期或时间戳(可能是时区),并依靠日期算法根据需要对它们进行排序。

在应用程序级别,您将诸如 April 2003 之类的垃圾转换为数据库将接受存储的合理格式。如果您使用的是 php,strtotime会有很大帮助。

于 2013-06-16T12:50:56.147 回答