【问题标题】:Parameters on time stamps in oracle sql developeroracle sql developer中的时间戳参数
【发布时间】:2016-05-25 12:58:34
【问题描述】:
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 developer 中的表中提取的时间戳查看它的变化。有什么建议或帮助吗?

【问题讨论】:

  • 'between' 包含;您真的想要第一个存储桶中的 18:00:00,所以第二个存储桶从 18:00:01 开始,还是第一个存储桶真的应该在 17:59:59 结束?该列实际上是日期还是时间戳?
  • 有没有办法从 '00:00:00' 和 '06:00:00' 夜班中减去 6 小时,这样它就代表前一天的夜班?
  • 你可能想要something like this

标签: sql oracle


【解决方案1】:

HH24 创建零填充小时。你可以试试:

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

【讨论】:

  • 有没有办法从 '00:00:00' 和 '06:00:00' 夜班中减去 6 小时,这样它就代表前一天的夜班?
  • @james_weasel 。 . .你应该问另一个问题。
【解决方案2】:

由于 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;

【讨论】:

  • 有没有办法从 '00:00:00' 和 '06:00:00' 夜班中减去 6 小时,这样它就代表前一天的夜班?
  • 当然,但是您的查询忽略了此刻的这一天,所以不确定您希望它如何工作?基本上只是date1 - 6/24,您可以使用trunc(date1 - 6/24) 进行分组。取决于你真正需要什么。如果你想要它在 where 子句中,那么最好调整变量 date。
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 2020-07-13
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
相关资源
最近更新 更多