2010-04-14 105 views
2

我们有两个字段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-16to日期时,用户显然并没有意味着2010-04-16 00:00。相反,用户的意思是2010-04-16 24:00,即计算行程的持续时间应该输出3 days,而不是2 days

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

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

您是否仅使用这些日期来计算持续时间?如果是这样,那么你可以用'duration'替换'to'字段,例如'x小时y分钟'。 AFAIK数据库具有用于此目的的区间数据类型。 – Juris 2010-04-14 11:24:04

回答

1

有没有一种神奇的方式来做到这一点,显着提高了在'to'字段中存储23:59(或者你喜欢的任何级别的精度)。

这种类型的需求弹出在美国司法管辖区内使用的保险单管理系统中。通常,开始日期和到期日期必须随时间记录,到期日期记录为xxxx-xx-xx 23:59。令人遗憾的是,除此之外,没有什么神奇的公式可以将时间分量默认为23:59。

1

海事组织的最佳途径是使用平台或类库,其中具有与“日期和时间”以及主题上的多种变体分开的“日期”概念。 (不要忘记在“from”和“to”之间可能存在日光节约转换的可能性:)

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

因此,在这种情况下,您确实需要知道是输入日期还是午夜 - 它们是根本不同的。如果他们将“from”作为日期和“to”作为日期/时间输入,那么你会做些什么,我不确定...可能仍然使用“from”的开始日期和“from”的给定时间“到......”但它有点狡猾。从根本上说,你应该尝试存储所有你知道的信息,并且只有你知道的信息 - 所以如果你没有单独的类型,存储一个单独的“这只是一个日期”字段似乎是合理的。这很丑陋,但那是因为这个平台对你的帮助不大。