oracle sql developer中的时间戳参数

时间:2016-05-25 12:58:34

标签: sql oracle

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开发人员中的表中提取的时间戳来查看它的变化。有什么建议或帮助吗?

2 个答案:

答案 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;