10

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

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

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

我考虑过的选项:

  1. 作为字符串,具有标准格式(可能是 24 小时 HH:MM:SS+Z)。
  2. 作为 0 <= n < 24 范围内的数字,小数部分表示分钟/秒(无法存储时区信息?)。
  3. 作为具有规范化/未使用日期组件的 PHPDateTime和 Oracle DATE,例如0001-01-01.
  4. 与上面相同,仅使用 Unix 时间戳(PHPinteger和 Oracle TIMESTAMP)。

目前我正在使用上面的#3,但我似乎在滥用这些数据类型,这让我有点恼火。然而,据我所知,它提供了最好的可用性。比较和排序在 PHP 和 Unix 中都按预期工作,可以维护时区数据,并且显示数据实际上不需要任何特殊操作。

我忽略了什么,还是有更合适的方法?

4

3 回答 3

2

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

interval day(0) to second(6)
于 2012-07-11T15:39:49.380 回答
2

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

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

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

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

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

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

于 2012-07-29T10:20:40.027 回答
1

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

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

在计算日期时使用 unix 时间戳很方便,但在计算时间时可能不太方便。虽然使用它似乎有一些好处,例如很容易将时间戳添加到时间戳,但我发现必须将所有内容转换为时间戳才能进行计算是令人讨厌和烦人的,所以我会避开这种情况。

所以,总结一下:

  1. 如果您想轻松存储而不是操作数据,字符串可能是一种有效的方法。它们易于阅读和验证。对于其他任何事情,请选择其他内容。
  2. 以数字计算使计算变得超级简单。将时间/日期转换为小数,完成所有重击,然后恢复为实时格式并存储。
  3. PHP 的 Datetime 和 Oracle 的 Date 都很方便,并且在 oracle 和 PHP 中内置了一些很棒的函数来操作数据,但即使是最好的函数也可能比添加一些小数更难。我认为以日期格式将数据存储在数据库中可能是一个安全的想法 - 特别是如果您想根据查询中的列进行计算。您计划在 PHP 中使用它们的方式将决定您如何使用它们。
  4. 我会立即排除选项四。

编辑:我刚刚和一个朋友就时间类型进行了一次有趣的聊天。您应该注意的另一件事是,有时基于时间的对象可能会导致比它们解决的问题更多的问题。他正在研究一个我们跟踪交货日期和时间的应用程序。数据实际上存储在 datetime 对象中,但要注意的是:卡车交货时间是针对特定日期和交货窗口设置的。可接受的交货是准时交货,或在交货时间后一小时内交货。当一辆卡车在晚上 11:30 到达并在 45 分钟后出现时,这造成了一些破坏。虽然仍在可接受的窗口内,但它显示为第二天。另一个问题是在一个配送中心,它实际上在 4:00 AM 开始每天 24 小时工作。

于 2012-08-02T10:27:12.990 回答