select TO_CHAR(date1,'HH24:MI:SS') time_in,
CASE
WHEN TO_CHAR(date1,'HH24:MI:SS') between '6:00:00' AND '18:00:00' then 'day_shift'
WHEN TO_CHAR(date1,'HH24:MI:SS') BETWEEN '18:00:00' AND '24:00:00' then 'night_shift'
WHEN TO_CHAR(date1,'HH24:MI:SS') BETWEEN '0:00:00' AND '6:00:00' then 'night_shift'
END AS shift
from blah
尝试制作它,以便您可以根据我从sql开发人员中的表中提取的时间戳来查看它的变化。有什么建议或帮助吗?
答案 0 :(得分:1)
select 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 '18:00:00' AND '24:00:00'
THEN 'night_shift'
WHEN TO_CHAR(date1,'HH24:MI:SS') BETWEEN '00:00:00' AND '06:00:00'
THEN 'night_shift'
END) AS shift
from blah
创建零填充小时。你可以试试:
{{1}}
答案 1 :(得分:0)
由于between
具有包容性,因此您的查询当前会尝试在前两个when
子句中与18:00:00匹配,在第一个和第三个子句中与06:00:00匹配。无论如何它将在第一场比赛中停止,但在两个条款中具有相同的值使得不清楚你期望或想要发生什么。即使有闰秒,你也不会获得“24:00:00”的价值。
所以你可以简化一下:
select 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'
else 'night_shift'
end as shift
from blah;
你的范围的结尾可能超过你需要的一秒。如果第一个范围真的只需要早于结束而不是18:00,那么应该是:
select to_char(date1,'HH24:MI:SS') time_in,
case when to_char(date1,'HH24:MI:SS') between '06:00:00' and '17:59:59'
then 'day_shift'
else 'night_shift'
end as shift
from blah;
虽然在这种情况下你只是真正关注时间 - 你可能仍然希望有足够的时间来明确你所看到的内容。如果date
是时间戳,您甚至可以这样做:
select to_char(date1,'HH24:MI:SS') time_in,
case when extract(hour from date1) between 6 and 17
then 'day_shift'
else 'night_shift'
end as shift
from blah;
如果它是一个日期而不是时间戳你仍然可以这样做,如果你施展,但它可能不值得努力:
select to_char(date1,'HH24:MI:SS') time_in,
case when extract(hour from cast(date1 as timestamp)) between 6 and 17
then 'day_shift'
else 'night_shift'
end as shift
from blah;