【问题标题】:Subtract one hour from datetime rather than one day从日期时间减去一小时而不是一天
【发布时间】:2013-04-11 15:47:56
【问题描述】:

我在 Oracle 中有一个 datetime 列 (MM/DD/YYYY HH:MM:SS AM/PM) 但是当我这样做时:

SELECT MAX(D_DTM)-1 FROM tbl1

...它可以追溯到一天。如何从列中删除一小时而不是一天?

我还注意到上午 12 点的 datetime 记录看起来像 MM/DD/YYYY 而不是 MM/DD/YYYY 00:00:00;我不确定这是否重要。

【问题讨论】:

  • 您如何查看上午 12 点的值?是通过SQLPlus还是前端语言(C#、PHP等)?
  • 使用 Toad,是前端的问题吗?我是 Oracle 环境的新手
  • 这可能是 TOAD 的东西,但我对 TOAD 不熟悉。如果列中的所有其他日期都显示时间分量而“午夜”日期不显示,我认为可以安全地假设“午夜”确实存在并且 TOAD 只是“有用地”隐藏它。可能有一个设置可以打开或关闭此功能,但这只是猜测。我确实知道 .NET 语言和 PHP 会识别时间部分——即使它是零——而且可能几乎所有其他语言也会。

标签: oracle datetime plsql date-arithmetic


【解决方案1】:

很简单。

sysdate - 5/(24*60*60) --> 从 systime 中减去 5 秒

sysdate - 5/(24*60) --> 从 systime 中减去 5 分钟

sysdate - 5/(24) --> 从 systime 中减去 5 小时

因此

select (sysdate - (1/24)) from dual

【讨论】:

  • 您能否进一步扩展您的答案,例如为什么要使用除法减法?
  • @CodyGuldner 该部门将值计算为天数的一小部分。 (1 小时是一天的 1/24,所以 5/24 天是 5 小时。)然后减去一天。不过,就我个人而言,我会担心浮点错误。
  • @jpmc26 这个想法是应该在答案中包含这样的信息。
【解决方案2】:
select sysdate - numtodsinterval(1,'hour') from dual

【讨论】:

    【解决方案3】:

    另一种使用间隔的方法是

    NUMTODSINTERVAL( number, expression )
    

    例子

    NUMTODSINTERVAL(150, 'DAY')
    NUMTODSINTERVAL(1500, 'HOUR')
    NUMTODSINTERVAL(15000, 'MINUTE')
    NUMTODSINTERVAL(150000, 'SECOND')
    

    我提出这个是因为它在使用 INTERVAL 不起作用的情况下很有用。

    【讨论】:

      【解决方案4】:

      或使用INTERVAL 函数。它具有相同的结果,但我认为它读起来更清楚 - 这当然只是一种意见:)

      SELECT MAX(D_DTM) - INTERVAL '1' HOUR FROM tbl1
      

      INTERVAL 函数的好处在于,在处理 DATE 值时,您可以将间隔设置为年、月、日、小时、分钟或秒,但处理 DATE 值时,月间隔可能会很棘手月底日期。

      是的,示例中 1 周围的引号是必需的。

      您还可以使用 Oracle 特定的 NumToDSInterval 函数,它不那么标准但更灵活,因为它接受变量而不是常量:

      SELECT MAX(D_DTM) - NUMTODSINTERVAL(1, 'HOUR') FROM tbl1
      

      【讨论】:

        【解决方案5】:

        Randy's answer 不错,不过也可以使用区间:

        SELECT MAX(D_DTM)- interval '1' hour FROM tbl1
        

        【讨论】:

        • 更好地回答 IMO,让未来的编码人员更清楚地知道发生了什么
        【解决方案6】:

        是的 - 日期按整数天计算。

        如果你想要几个小时,你需要做一些数学 - 比如-(1/24)

        【讨论】:

          猜你喜欢
          • 2015-05-13
          • 2011-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-03
          • 1970-01-01
          • 2010-10-01
          • 2020-01-14
          相关资源
          最近更新 更多