尝试从某个时间中减去小时数,使其显示为前一天
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;
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;