PHP / Oracle:时间表示

时间:2012-07-11 13:13:03

标签: php oracle types time

免责声明:我完全清楚表示日期/时间的最佳方式是Unix时间戳或PHP的DateTime类以及Oracle的{{1数据类型。

有了这个,我想知道用于存储时间数据的最合适的数据类型(在PHP中,以及Oracle)。我对存储日期组件不感兴趣;只有时间。

例如,假设我有一个DATE实体,我想为此存储他/她的典型工作时间表。该员工可能在上午8:00至下午5:00工作。这些时间没有 date 组件,那么应该用什么来存储它们并代表它们呢?

我考虑的选项:

  1. 作为字符串,采用标准格式(可能是24小时HH:MM:SS + Z)。
  2. 作为0 <= n <0的范围内的数字。 24,小数部分代表分钟/秒(不能存储时区信息?)。
  3. 具有规范化/未使用日期组件的PHP employee和Oracle DateTime,例如DATE
  4. 同上,仅使用Unix时间戳(PHP 0001-01-01和Oracle integer)。
  5. 目前我正在使用上面的#3,但有点让我感到困惑的是,我似乎在滥用这些数据类型。但是,就我所知,它提供了最佳的可用性。比较和排序PHP和Unix中预期的所有工作,可以维护时区数据,并且实际上不需要任何特殊操作来显示数据。

    我是否忽视了任何事情,还是有更合适的方式?

3 个答案:

答案 0 :(得分:2)

如果您根本不需要日期,那么您需要的是interval day数据类型。我没有必要实际使用它,但以下应该工作:

interval day(0) to second(6)

答案 1 :(得分:2)

您使用的选项(3)是最好的选项。

Oracle有以下类型用于存储时间和日期:

  • 日期
  • 时间戳(带(本地)时区)
  • 年度间隔
  • 间隔天到秒

区间数据类型不适合您,因为您关心何时开始以及何时完成。你可以使用一个日期和一个间隔,但这似乎与我不一致,因为你仍然有一个“不正确”的日期。

您提到的所有其他选项都需要更多工作,并且与本机日期类型相比,可能还会导致性能下降。

有关oracle日期类型的更多信息:http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm#i1005946

答案 2 :(得分:1)

我认为这个问题的最正确答案完全取决于您计划对数据做些什么。如果您计划在PHP中完成所有工作而在数据库中没有任何工作,那么存储数据的最佳方式将是以最简单的方式获取数据,以便帮助您完成PHP中的操作。这可能确实将它们存储为字符串。这对DBA来说可能听起来很可怕,但你必须记住数据库是为你的应用程序服务的。另一方面,如果您在数据库中使用一些奇特的查询进行了大量的比较,请确保以一种使查询最有效的格式存储在数据库中的所有内容。

如果您正在执行计算工作小时数的重负荷等任务,转换为十进制格式可能会使计算更容易,最终转换回小时:分钟。当您从数据库获取数据,将其转换为十进制,执行所有计算,然后重新运行以转换回时间格式时,可以编写一个简单的函数来往返转换十进制数。

使用unix时间戳在计算日期时很方便,但在计算时间时可能不会那么多。虽然似乎有一些积极因素使用它,比如很容易在时间戳中添加时间戳,但我发现必须将所有内容转换为时间戳到计算是麻烦烦人的,所以我会避开这种情况。

所以,总结一下:

  1. 如果您想轻松存储,但不能操纵数据,则可以使用字符串 一种有效的方法。它们易于阅读和验证。为了任何东西 否则,选择别的东西。
  2. 计算数字可以实现超级简单的计算。兑换 时间/日期为小数,执行所有重度提示,然后恢复为 实时格式和商店。
  3. PHP的Datetime和Oracle的Date都很方便,还有一些 内置于oracle和PHP中的奇妙功能来操纵 数据,但即使是最好的功能也可能比添加更困难 一些小数一起。我认为将数据存储在 日期格式的数据库可能是一个安全的想法 - 特别是如果 您想要根据查询中的列进行计算。 您计划在PHP中使用它们将决定您的使用方式 它们。
  4. 我会立即决定选项四。
  5. 编辑:我和朋友聊了很多关于时间类型的事。您应该注意的另一件事是,有时候基于时间的对象会导致比他们解决的问题更多的问题。他正在调查我们跟踪交付日期和时间的应用程序。事实上,数据存储在日期时间对象中,但这里是捕获:卡车交货时间是针对特定日期和交货窗口设置的。可接受的交付要么准时,要么在一个小时之后。当一辆卡车在晚上11:30到达并在45分钟后出现时,这造成了一些严重破坏。虽然仍在可接受的窗口内,但它显示为第二天。另一个问题是在一个配送中心实际上在凌晨4点开始工作,每天24小时开始。设定工作人员的工作时间 - 并将其合并到围绕正常日期的付款证明非常令人头痛。