将数据库中的日期存储为数据库的Java最佳做法是什么?

Mat*_*ros 10 java sql timestamp date mongodb

我这样做的原因是,作为日期对象存储在任何数据库中的日期往往以特定格式编写,这可能与您需要在前端向用户呈现的内容大不相同.我还认为,如果您的应用程序从不同类型的数据存储中提取信息,这将特别有用.一个很好的例子是MongoDB和SQL日期对象之间的区别.

但是,我不知道这是否是推荐的做法.我应该将日期保存为长(以毫秒为单位)或作为日期对象吗?

T.J*_*der 23

我不能说与MongoDB有关,但在SQL数据库中,不,这不是最佳实践.这并不意味着可能没有偶尔的用例,而是"最佳实践",没有.

将它们存储为日期,将它们检索为日期.您最好的办法是设置数据库以将它们存储为UTC(松散地,"GMT"),以便数据是可移植的,并且您可以根据需要使用不同的本地时间(例如,如果数据库由地理位置不同的用户使用) ,并处理应用层中从UTC到本地时间的任何转换(例如,通过Calendar或第三方日期库).

存储日期为数字意味着您的数据库很难对报告,对运行即席查询,等等.我犯了那个错误一次,这不是一个我重复没有真正很好的理由.:-)

  • +1和另一个提及时区.如果允许每个用户在他自己的时区中解释毫秒,那么用手来纠正偏移是一种痛苦* (2认同)

Jon*_*eet 5

这在很大程度上取决于:

  • 您正在使用什么数据库及其日期/时间支持
  • 您的客户需要(例如,您对将永远使用Java 的想法感到高兴)
  • 您真正想要表达的信息是什么
  • 您的诊断工具

第三点可能是最重要的.想想你试图存储的价值究竟是什么意思.即使您显然没有使用Noda Time,但希望我的用户指南页面根据您的输入数据选择使用哪种Noda Time类型可能会帮助您清楚地思考这一点.

如果使用Java,并且您的数据库对日期/时间类型没有非常好的支持,并且您只是试图表示"及时"(而不是,例如,某个特定时刻)时区,或带偏移的本地日期/时间,或只是本地日期/时间,或只是日期......),您可以轻松编写诊断工具将数据转换为更易读的形式 - 然后存储一个long是合理的.但这是一个很长的"if"列表.

如果您希望能够在数据库中执行日期操作 - 例如询问在该月的第一天发生的所有值 - 那么您应该使用日期/时间类型,在时区周围小心.(我的经验是,大多数数据库都至少令人震惊的严重记录,当谈到自己的日期/时间类型.)

通常,您应该使用能够满足您所有要求的任何类型,并且是该特定环境的最自然的表示.因此,在具有日期/时间类型的数据库中,当您与其进行交互时不会出现问题(例如,以未请求的方式执行任意时区转换),请使用该类型.它将使各种事情变得更容易.

使用更"原始"表示(例如64位整数)的优点正是数据库不会乱用它.你有效地隐藏了数据库中数据的含义,具有该方法的所有正常优点和缺点(主要是缺点).