Postgres和部分日期

时间:2013-06-16 12:39:35

标签: sql database postgresql nosql

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

  • 支持部分日期: 1994年2月2日,格林尼治标准时间16:45 2003年4月均有效
  • 具有可比性:我想查询特定日期之前或之后的每个条目(此日期始终完成,即精确到秒和时区)。 2003年4月应该在 1994年2月2日,格林威治标准时间16:45 + 4 之后,日期应该按精度排序(即 2003年4月 *来在 2003年4月3日之前)。

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

有什么有趣的想法吗?

2 个答案:

答案 0 :(得分:7)

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

你的例子是:

  • “1994年2月5日,格林尼治标准时间16:45 + 4”:1994-05-02T12:45:00Z
  • “2003年4月”:2003-04

您可以将这些作为简单字符串进行排序和比较,并获得您想要的结果。即2003-04-03之后的词句2003-04

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

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

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

答案 1 :(得分:1)

在PG数据库中,您可以存储日期或时间戳(大概是时区),并依赖日期算术来根据需要对它们进行排序。

在应用程序级别,您将垃圾(例如2003年4月)转换为数据库将接受存储的合理格式。如果您使用的是php,strtotime可以提供很多帮助。