【问题标题】:How to store only time; not date and time?如何只存储时间;不是日期和时间?
【发布时间】:2010-12-19 16:12:20
【问题描述】:

在一个字段中,我不需要存储日期时间对,即标准 Oracle 日期。

01/10/2009 22:10:39

只是时间

22:10:39

我认为可以节省磁盘空间(我有 200 万行)或提供更快的处理速度。

【问题讨论】:

  • 在宏伟的计划中,200 万行实际上是微不足道的。微不足道的空间节省是否值得牺牲精度?
  • 我想我应该问的问题是“更快地处理什么?”如果您拥有一天中的所有时间,则无法将其与其他任何东西进行可靠的比较,因此您无法存储任何内容并为自己节省每行的全部 7 个字节。
  • 另一个只应存储时间但我们不关心日期的应用程序领域:重复事件开始时间。例如。事件的开始和结束时间存储在 MTG_START 和 MTG_END 中。但这些适用于不同的日期/日期,具体取决于星期。我只想存储一天中的时间,这样我就不会混淆数据库表的未来开发人员/用户。有没有办法做到这一点?

标签: sql oracle time


【解决方案1】:

你可以使用:

TO_CHAR(<DATE_COLUMN>, '<TIME_FORMAT>');

例子

TO_CHAR(SYSDATE, 'HH24:MI:SS');

时间格式可以在here查看

【讨论】:

    【解决方案2】:

    您可以从日期中提取时间作为字符串,如下所示:

    to_char(sysdate,'HH.MI.SS')
    

    但没有时间数据类型可以帮助您节省空间。

    【讨论】:

    • 如果您将其存储为 VARCHAR 列,则任何内容都可以存储在列中,这在再次尝试将其取出时不是很有用。
    【解决方案3】:

    您可以尝试 INTERVAL DAY TO SECOND 数据类型,但它不会为您节省任何磁盘空间......不过它非常适合此目的。

    create table t1 (time_of_day interval day (0) to second(0));
    
    insert into t1 values (TO_DSINTERVAL('0 23:59:59'));
    
    select date '2009-05-13'+time_of_day
    from   t1;
    

    11 个字节。

    【讨论】:

      【解决方案4】:

      您将节省几 Mb 的磁盘空间(现在什么都不是),并且您几乎不会获得任何性能。

      您可以按照建议使用NUMBER 类型的列来存储自午夜以来的秒数,只是不要忘记限制。
      (您可能会使用 NUMBER(5, 0),它使用 1-3 个字节,具体取决于存储的值,而不是 DATE 列使用的常量 7 个字节)

      【讨论】:

        【解决方案5】:

        您最好的选择可能是将“自午夜以来的秒数”存储为数字字段。

        SELECT to_char( SYSDATE, 'SSSSS' ) FROM dual;
        

        【讨论】:

        • 当然,您必须考虑 (1) 始终转换值的性能损失和 (2) 对其他标准日期算术使用奇怪计算的开发时间损失。
        • @jva:是的,我正要提到这一点,但当我想到它的时候,我认为这个线程已经死了,所以为什么要打扰
        • 我确实喜欢这种方法,但有两点值得一提。数据应该存储在一个数字中,以确保您不能插入字符,并且应该对列有一个检查约束,以确保您不能以秒为单位输入超过 24 小时。
        猜你喜欢
        • 2011-11-01
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多