PHP/Oracle:时间表示

PHP/Oracle:时间表示,php,oracle,types,time,Php,Oracle,Types,Time,免责声明:我完全知道表示日期/时间的最佳方式是Unix时间戳或PHP的DateTime类和Oracle的date数据类型 有了这些,我想知道最适合存储时间数据的数据类型是什么(在PHP和Oracle中)。我对存储日期组件不感兴趣;只有时间 例如,假设我有一个员工实体,我想存储他/她的典型工作计划。该员工可能在上午8:00至下午5:00工作。这些时间没有日期组件,那么应该使用什么来存储和表示它们呢 我考虑过的备选方案: 作为字符串,使用标准格式(可能是24小时HH:MM:SS+Z) 如果您根本不需

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

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

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

我考虑过的备选方案:

  • 作为字符串,使用标准格式(可能是24小时HH:MM:SS+Z)

  • 如果您根本不需要日期,那么您需要的是
    间隔日
    数据类型。我还没有必要实际使用它,但以下应该可以:

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

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

    • 日期
    • 时间戳(带(本地)时区)
    • 年复一月
    • 隔日
    间隔数据类型不是您的选项,因为您关心何时开始和何时结束。你可以使用一个日期和一个时间间隔,但这对我来说似乎不一致,因为你仍然有一个“不正确”的日期

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


    有关oracle日期类型的更多信息:

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

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

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

    总而言之:

  • 如果您想方便地存储数据,但不想操纵数据,可以使用字符串 一种有效的方法。它们易于阅读和验证。无论如何 否则,选择别的
  • 以数字计算使计算变得非常简单。转换 将时间/日期设置为十进制,执行所有重击,然后恢复到 实时格式和存储
  • PHP的Datetime和Oracle的Date都很方便,并且有一些 oracle和PHP中内置了奇妙的函数来操作 数据,但即使是最好的函数也可能比添加更困难 一些小数加起来。我认为将数据存储在 使用日期格式的数据库可能是一个安全的想法,尤其是在 您希望根据查询中的列进行计算。 您打算在PHP中使用它们做什么将决定您如何使用它们 他们
  • 我会立刻排除选项四

  • 编辑:我刚刚和一个朋友聊了一次关于时间类型的有趣的话题。另一件您应该注意的事情是,有时基于时间的对象可能会导致比它们解决的问题更多的问题。他正在研究一个我们跟踪交货日期和时间的应用程序。数据实际上存储在datetime对象中,但关键是:卡车交付时间是为特定的一天和交付窗口设置的。可接受的交货要么准时,要么在交货后一小时内交货。当一辆卡车在晚上11:30到达并在45分钟后出现时,这造成了一些混乱。虽然仍在可接受的时间范围内,但第二天就出现了。另一个问题是在一个配送中心,该配送中心从24小时开始,每天的工作时间为凌晨4点。设置员工的工作时间——并将其合并为围绕正常日期的付款证明是一件非常头痛的事情。

    如果可能的话,始终使用本地表示法,因此#3我不太理解#2:如果数据表示小时,为什么需要存储时区信息?我认为它们将根据上下文与本地时区保持一致。或者,您是否也要将区域信息与时间一起存储?您可以在查找表中使用整数,也可以直接在该点上使用字符串字段。@drrcknlsn刚刚添加了另一个您可能感兴趣的编辑。@Fluffeh:谢谢,这也是我需要注意的。看到您后来对您的问题进行了悬赏,这没有帮助吗?没有,对不起。您的解决方案不允许我存储诸如“10:30pm”之类的数据。时间间隔就是那个时间间隔。我需要存储特定的时间,而不是间隔,而且我需要在不考虑日期的情况下进行存储。嗯,可以使用小于1天的时间间隔来存储小时,尽管它确实是
    interval day(0) to second(6)