Oracle PLSQL将日期时间截断为特定小时

ffx8fchx  于 2023-10-16  发布在  Oracle
关注(0)|答案(3)|浏览(107)

我有一个Oracle PLSQL代码生成一个日期时间戳列表,我想将它们截断到上午7点和下午7点的特定时间,而不是一天的开始。
举例来说:

  • 01/03/2013 0700变为01/03/2013 0700
  • 2013年3月1日1235变为2013年3月1日0700
  • 2013年3月1日1932变为2013年3月1日1900
  • 2013年3月2日0612变为2013年3月1日1900

我的代码目前是:

SELECT  TRUNC(TRUNC(SYSDATE,'hh') + 1/24 - (ROWNUM) / 24, 'dd')  as shift_date
 FROM widsys.times
 ORDER BY SYSDATE
ig9co6j1

ig9co6j11#

无条件:)

Select your_date, 
  trunc(your_date - 7/24) +                       --the date
  trunc(to_char(your_date - 7/24,'hh24')/12)/2 +  --which half of day
  7/24                                            --shift the hour
from 
your_table;

看小提琴。

bt1cpqcv

bt1cpqcv2#

with data(time) as (
  select to_date('2013-09-19 00:00:00', 'YYYY-MM-DD HH24:MI:SS') from dual union all
  select to_date('2013-09-19 06:45:44', 'YYYY-MM-DD HH24:MI:SS') from dual union all
  select to_date('2013-09-19 08:12:25', 'YYYY-MM-DD HH24:MI:SS') from dual union all
  select to_date('2013-09-19 18:59:59', 'YYYY-MM-DD HH24:MI:SS') from dual union all
  select to_date('2013-09-19 19:00:00', 'YYYY-MM-DD HH24:MI:SS') from dual union all
  select to_date('2013-09-19 20:15:35', 'YYYY-MM-DD HH24:MI:SS') from dual union all
  select to_date('2013-09-19 23:59:59', 'YYYY-MM-DD HH24:MI:SS') from dual
)
select d.time,
case
  when to_number(to_char(d.time, 'HH24')) >= 19 then
    trunc(d.time) + 19/24
  when to_number(to_char(d.time, 'HH24')) >= 7 then
    trunc(d.time) + 7/24
  else
    trunc(d.time - 1) + 19/24
end as shift_date
from data d
;
qgzx9mmu

qgzx9mmu3#

您是否正在寻找这样的查询:

SELECT   CASE
    WHEN TO_CHAR(your_date, 'hh24') > 12
    THEN TRUNC(your_date)+ 19/24
    ELSE TRUNC(your_date)+ 7/24
  END
FROM your_table;

相关问题