【问题标题】:Storing a calendar day in sqlite database在 sqlite 数据库中存储日历日
【发布时间】:2010-09-12 09:26:29
【问题描述】:
我需要在 sqlite 数据库中存储带有日历日期(只是一天,没有时间)的项目。在列中表示日期的最佳方式是什么?朱利安天和 unix 秒是合理的选择。如果我去的单位不是天,应该是几点钟?
更新:我知道 ISO8601 并实际使用它将日期存储为原型的 YYYY-MM-DD 格式的字符串。但是对于各种算术,我必须在内部将其转换为某个数字,所以我更愿意存储一个数字并转换为字符串进行显示。这个数字应该用什么单位,来源是什么,如果单位比天更精确,应该使用一天中的什么时间?
【问题讨论】:
标签:
sqlite
date
time
calendar
iso8601
【解决方案1】:
如果您希望将日期交给外部工具或库,您应该使用它所期望的任何格式。 Unix 时间似乎是数字时计的通用语,所以如果外部环境不适合你,它是一个很好的默认设置。
ISO 8601 可能感兴趣。
编辑:
但是对于各种算术,我必须在内部将其转换为某个数字,所以我更愿意存储一个数字,然后转换为字符串进行显示。
啊,有道理。如果您的环境(.NET?Python?C++?)有时间处理工具,最好使用它们的本机单元和纪元。没有理由重写所有这些日期操作函数。他们比看起来更棘手。否则,我会使用本地(公历?)日历中的天数,因为您的应用程序处于合理的时期。大方一点,当您突然需要处理比您预期更早的日期时,您不希望出现反向千年虫错误。
一天中的时间完全取决于口味。午夜似乎是最干净的选择(小时、分钟、秒字段中的所有零),但由于它永远不会到达用户那里,因此没有实际意义。事实上,这将是一个复活节彩蛋的好地方。
【解决方案2】:
如果您想覆盖您的基础,请确保以 UTC 格式存储日期并选择 ISO 标准。这种方法需要最少的努力,并且可以保护您的代码免受未来互操作的困扰。
我同意@skymt ISO 8601 是一个不错的选择。
【解决方案3】:
如果您使用的是 C++,那么 boost::date_time 非常值得一看。
【解决方案4】:
“最佳”几乎完全取决于日期的来源(NSDate 对象、一些 XML 提要)以及它们的操作方式(简单地按原样存储与执行一些算术,如“天数”)。
我不一定推荐这个,但我写了一个应用程序,它还需要在 SQLite 数据库中存储日期但不是时间。起初我使用了两列,月和日,其中月定义为自 2000 年 1 月以来的月数。我需要强制每个日期一行,所以我在这两列中定义了一个唯一索引,然后它变成了让更新变得非常缓慢。
在我的第二次尝试中,我使用了类似的方案,但将日期编码为一个数字,使用低 5 位表示日,其余高位表示月(同样,自 2000 年 1 月以来)。转换函数是:
Date = (Month << 5) | Day
Month = Date >> 5
Day = 0x1F & Date
此方案保留了日期的数字顺序,并且可以轻松地将它们拆分为组件。这对我的应用程序很有意义,因为我按月存储数据。如果给定一个日期,您想查找下一个日期,则此方案可能不是最佳方案,因为日期 + 1 可能不是有效日期。