【问题标题】:The woes of (sometimes) storing "date only" in datetimes(有时)在日期时间中存储“仅日期”的麻烦
【发布时间】:2010-04-14 10:53:36
【问题描述】:

我们有两个字段fromto(类型为datetime),用户可以在其中存储出差的开始时间和结束时间,例如:

From: 2010-04-14 09:00
  To: 2010-04-16 16:30

所以,行程的持续时间是 2 天 7.5 小时。

通常,确切的时间是事先不知道的,所以用户输入的日期没有时间:

From: 2010-04-14
  To: 2010-04-16

在内部,这存储为 2010-04-14 00:002010-04-16 00:00,因为这是大多数现代类库(例如 .net)和数据库(例如 SQL Server)在日期时间结构中存储“仅日期”时所做的事情。通常,这是完全合理的。

然而,当输入2010-04-16 作为to 日期时,用户显然不是的意思是2010-04-16 00:00。相反,用户的意思是2010-04-16 24:00,即计算行程的持续时间应该输出3 days,而不是2 days

我可以想到一些(或多或少丑陋的)解决这个问题的方法(如果用户没有输入时间组件,请在to 字段的 UI 层添加“23:59”;添加一个特殊的“日期是全天”布尔字段;将“2010-04-17 00:00”存储在数据库中,但如果时间组件为“00:00”,则向用户显示“2010-04-16 24:00”;.. .),各有利弊。由于我认为这是一个相当普遍的问题,我想知道:

  • 是否有解决问题的“标准”最佳实践方法?
  • 如果没有,您是否遇到过类似的需求,您是如何解决的,该解决方案的优缺点是什么?

【问题讨论】:

  • 您是否仅使用这些日期来计算持续时间?如果是这样,那么您可以将to 字段替换为duration,例如x hours y minutes。为此,AFAIK 数据库具有区间数据类型。

标签: database language-agnostic datetime date


【解决方案1】:

没有一种神奇的方法可以显着改善在“到”字段中存储 23:59(或您喜欢的任何准确度)。

此类要求出现在美国司法管辖区使用的保险单管理系统中。通常,开始和到期日期必须与时间一起记录,到期日期记录为 xxxx-xx-xx 23:59。可悲的是,除了将时间组件默认设置为:字段为 23:59 之外,没有任何神奇的公式可以解决此问题。

【讨论】:

    【解决方案2】:

    IMO 的最佳方式是使用平台或类库,确实具有与“日期和时间”分开的“日期”概念以及主题的许多变体。 (不要忘记“从”和“到”之间可能存在夏令时转换的可能性:)

    在 Java 中,我建议使用 Joda Time;在 .NET 中,我的 Noda Time 项目有望成为最好的解决方案。

    因此,在这种情况下,您确实需要知道输入的是日期还是午夜 - 它们是根本不同的。如果他们输入“from”作为日期,输入“to”作为日期/时间,你会做什么,我不确定......可能仍然使用“start of day”作为“from”,给定时间作为“to”……但有点狡猾。

    但从根本上说,您应该尝试存储您知道的所有信息,并且存储您知道的信息 - 因此,如果您没有单独的类型,请存储一个单独的“这只是一个日期”领域似乎是合理的。这很难看,但那是因为该平台没有为您提供应有的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 2013-07-25
      • 2016-08-07
      相关资源
      最近更新 更多