免责声明:我完全清楚表示日期/时间的最佳方式是Unix时间戳或PHP的DateTime
类以及Oracle的{{1数据类型。
有了这个,我想知道用于存储时间数据的最合适的数据类型(在PHP中,以及Oracle)。我对存储日期组件不感兴趣;只有时间。
例如,假设我有一个DATE
实体,我想为此存储他/她的典型工作时间表。该员工可能在上午8:00至下午5:00工作。这些时间没有 date 组件,那么应该用什么来存储它们并代表它们呢?
我考虑的选项:
employee
和Oracle DateTime
,例如DATE
。0001-01-01
和Oracle integer
)。目前我正在使用上面的#3,但有点让我感到困惑的是,我似乎在滥用这些数据类型。但是,就我所知,它提供了最佳的可用性。比较和排序PHP和Unix中预期的所有工作,可以维护时区数据,并且实际上不需要任何特殊操作来显示数据。
我是否忽视了任何事情,还是有更合适的方式?
答案 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时间戳在计算日期时很方便,但在计算时间时可能不会那么多。虽然似乎有一些积极因素使用它,比如很容易在时间戳中添加时间戳,但我发现必须将所有内容转换为时间戳到计算是麻烦烦人的,所以我会避开这种情况。
所以,总结一下:
编辑:我和朋友聊了很多关于时间类型的事。您应该注意的另一件事是,有时候基于时间的对象会导致比他们解决的问题更多的问题。他正在调查我们跟踪交付日期和时间的应用程序。事实上,数据存储在日期时间对象中,但这里是捕获:卡车交货时间是针对特定日期和交货窗口设置的。可接受的交付要么准时,要么在一个小时之后。当一辆卡车在晚上11:30到达并在45分钟后出现时,这造成了一些严重破坏。虽然仍在可接受的窗口内,但它显示为第二天。另一个问题是在一个配送中心实际上在凌晨4点开始工作,每天24小时开始。设定工作人员的工作时间 - 并将其合并到围绕正常日期的付款证明非常令人头痛。