在SQL中将日期字段舍入到下一个半小时

Pau*_*aul 7 sql oracle

在SQL中,我有一个DATE变量,我想要舍入到下一个可用的半小时(即xx:30).请注意,这不应该是最近的半小时.

这里有些例子:

Time                   Expected outcome
2012-03-26 11:25 AM    2012-03-26 11:30 AM
2012-03-26 11:45 AM    2012-03-26 12:30 PM
Run Code Online (Sandbox Code Playgroud)

有没有办法在SQL中执行此操作?

Jus*_*ave 11

这有点令人费解,但有点像

SELECT round( (date_col - trunc(date_col)) * 48 )/ 48 +
         trunc( date_col )
  FROM dual
Run Code Online (Sandbox Code Playgroud)

应该管用.

SQL> ed
Wrote file afiedt.buf

  1  select round((sysdate - trunc(sysdate)) * 48)/48 + trunc(sysdate),
  2         sysdate
  3*   from dual
SQL> /

ROUND((SYSDATE-TRUNC SYSDATE
-------------------- --------------------
26-mar-2012 14:30:00 26-mar-2012 14:35:30
Run Code Online (Sandbox Code Playgroud)
  • TRUNC(date_col) 截断时间到午夜.
  • date_col - trunc(date_col) 返回自午夜以来已过去的一天的分数.
  • 乘以48可得到半小时增量的数量
  • 舍入为您提供最近的半小时
  • 然后除以48可以得到一天中的一小部分可以加回到 trunc(date_col)


Mic*_*ton 4

给贾斯汀的原创性回答+1.

如果你想要一个更迂腐(或者,更容易理解或维护)的方法,

select case when to_number(to_char(sysdate,'mi')) > 30
       then trunc(sysdate,'mi') + ((60 - to_number(to_char(sysdate,'mi')) +30)/1440)
       else trunc(sysdate,'mi') + (30 - to_number(to_char(sysdate,'mi')))/1440 end
from dual
Run Code Online (Sandbox Code Playgroud)

我只是把它丢在那里,因为如果你需要做一些与其他数字类似的东西,比如像一小时45分钟那样,这可能是一种更具适应性的方法.你只需用45s取代三个30s就可以了.

但是,就性能而言,对于你的确切问题 - 贾斯汀是一个真正的赢家.