尝试从某个时间中减去小时数,使其显示为前一天

Trying to subtract hours from a certain time so it appears as the day before

select  to_char(to_date(date1,'DD/MM/YYYY'), 'DAY') AS the_day, TO_CHAR(date1,'HH24:MI:SS') time_in, 
       (CASE WHEN TO_CHAR(date1,'HH24:MI:SS') between '06:00:00' AND '18:00:00'
             THEN 'day_shift'
             WHEN TO_CHAR(date1,'HH24:MI:SS') BETWEEN '00:00:00' AND '06:00:00'          
             THEN time_in - 6/24
             ELSE 'night_shift'
        END) AS shift
from blah;

我的目标是从代码的“00:00:00”和“06:00:00”部分减去 6 小时。这样一来,它就不会说星期一夜班,而是会说星期日夜班。如果有意义的话,只是试图让转变存在的那一天不在乎时间。

现在我没有修改 date1,因为不清楚它在您的数据中是字符串列还是日期(日期时间)列。您已经知道如何将其拆分为日期和时间,因此您可能不需要这方面的帮助。

查询:

with blah(date1) as (
        select to_date('2016-04-20 14:00:30', 'yyyy-mm-dd hh24:mi:ss') from dual union all
        select to_date('2016-04-20 19:00:30', 'yyyy-mm-dd hh24:mi:ss') from dual union all
        select to_date('2016-04-20 04:00:30', 'yyyy-mm-dd hh24:mi:ss') from dual
     )
select to_char(date1, 'yyyy-mm-dd hh24:mi:ss') as date1,
       case when date1 - trunc(date1) >= 6/24 then to_char(date1, 'DAY')
            else to_char(date1 - 1, 'DAY') end as day_of_week,
       case when date1 - trunc(date1) between 6/24 and 18/24 then 'Day Shift'
            else 'Night Shift' end as shift
from blah;

输出:

DATE1               DAY_OF_WEEK                          SHIFT
------------------- ------------------------------------ -----------
2016-04-20 14:00:30 WEDNESDAY                            Day Shift
2016-04-20 19:00:30 WEDNESDAY                            Night Shift
2016-04-20 04:00:30 TUESDAY                              Night Shift

您的示例实际上没有意义,因为您在混合数据类型。我假设 date1 是一个时间戳。

with blah as
 (select cast(to_date('2016-05-26 06:00:00', 'YYYY-MM-DD HH24:MI:SS') as timestamp) date1 from dual)
select to_char(case
                 when extract(hour from date1 - trunc(date1)) < 6 then
                  date1 - 1
                 else
                  date1
               end,
           'DAY'),
       case
         when extract(hour from date1 - trunc(date1)) < 6
              or extract(hour from date1 - trunc(date1)) >= 18 then
          'night_shift'
         else
          'day_shift'
       end
  from blah;