我需要在sqlite数据库中存储具有日历日期(只是白天,没有时间)的项目。在列中表示日期的最佳方法是什么? Julian days和unix秒作为合理的选择而浮现在脑海中。如果我选择的时间不是几天,那应该是什么时间?

更新:我知道ISO8601并且实际上用它将日期存储为原型的YYYY-MM-DD格式的字符串。但是对于各种算法,我必须在内部将它转换为某个数字,所以我更喜欢存储一个数字,然后转换为字符串进行显示。这个数字应该包含哪些单位,具有什么来源,以及单位是否比日期更精确应该使用哪一天?

有帮助吗?

解决方案

如果您希望将日期交给外部工具或库,则应使用其预期的任何格式。 Unix时间似乎是数字恐怖的通用语言,所以如果外部环境不能为你做出选择,它就是一个很好的默认值。

ISO 8601 可能会引起您的兴趣。

编辑:

  

但是对于各种算法我必须在内部将其转换为某个数字,所以我更喜欢存储一个数字,然后转换为字符串进行显示。

啊,这是有道理的。如果你的环境(.NET?Python?C ++?)有时间处理工具,那么最好使用他们的原生单位和纪元。没有理由重写所有这些日期操作函数;他们比他们看起来更棘手。否则,我会在本地(格里高利?)日历中使用几天,因为您的申请是合理的时期。慷慨,当你突然需要提前处理日期时,你不需要反向的Y2K错误。

一天中的时间完全取决于品味。午夜似乎是最干净的选择(小时,分钟,第二场都是零),但由于它从未到达用户,因此没有实际意义。事实上,它将成为复活节彩蛋的好地方。

其他提示

如果您想覆盖基地,请确保将日期存储在utc中并选择iso标准。这种方法只需要很少的工作量,并且可以保护您的代码免受未来Interop的困扰。 我同意@skymt ISO 8601 是个不错的选择。

如果您使用的是C ++,那么boost :: date_time值得一看。

"最佳"几乎完全取决于日期的来源(NSDate对象,一些XML提要)以及它们是如何被操纵的(只是按原样存储而不是像“直到”之前的那样算术)。

我不一定推荐这个,但我写了一个应用程序,它还需要在SQLite DB中存储日期但不是时间。起初我使用了两个列,分别为月和日,其中Month定义为自2000年1月以来的月数。我需要强制执行每行一行,因此我在这两列中定义了一个UNIQUE索引,并且它已转让更新变得非常缓慢。

对于我的第二次尝试,我使用了类似的方案,但是将日期编码为一个数字,使用日期的底部5位和月份的剩余高位(再次,自2000年1月起)。转换函数是:

Date = (Month << 5) | Day
Month = Date >> 5
Day = 0x1F & Date

此方案保留日期的数字顺序,并使其易于拆分为组件。这对我的应用程序有意义,因为我每月都会存储数据。如果给定日期,您想要查找下一个日期,则此方案可能不是最佳方案,因为日期+ 1可能不是有效日期。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top