在Oracle SQL中按时间查询数据

时间:2015-04-06 12:08:35

标签: sql oracle

我在Oracle中有一个表,其中从不同的源插入数据。在2014年,我们发现有些消息来源没有插入带有日期的时间戳,但我们修复了它们,现在所有来源都以适当的格式插入数据,例如05/04/2015 4:30:42 PM

使用SQL查询,我们希望将数据分为3种类型,早班,晚班和无班次(对于没有时间戳的数据)。

上午班次将在00:00:0014:30:00

之间

夜班将在14:31:0023:59:00

之间

我用以下两种不同的方式编写了查询:

(a)中

 CASE
        WHEN TO_DATE(DATEANDTIME,'MM/DD/YYYY HH24:MI:SS') BETWEEN (TO_DATE ('00:00:00', 'HH24:MI:SS')) AND (TO_DATE ('14:30:00', 'HH24:MI:SS'))
        THEN
           'MORNING SHIFT'
        WHEN TO_DATE(DATEANDTIME,'MM/DD/YYYY HH24:MI:SS') BETWEEN (TO_DATE ('14:31:00', 'HH24:MI:SS')) AND  (TO_DATE ('23:59:00', 'HH24:MI:SS'))
        THEN
           'EVENING SHIFT'
        ELSE
          'NO SHIFT'
     END SHIFT

(b)中

CASE
        WHEN DATEANDTIME BETWEEN (TO_DATE ('00:00:00', 'HH24:MI:SS')) AND (TO_DATE ('14:30:00', 'HH24:MI:SS'))
        THEN
           'MORNING SHIFT'
        WHEN DATEANDTIME BETWEEN (TO_DATE ('14:31:00', 'HH24:MI:SS')) AND  (TO_DATE ('23:59:00', 'HH24:MI:SS'))
        THEN
           'EVENING SHIFT'
        ELSE
          'NO SHIFT'
     END SHIFT

查询(a)返回错误ORA-01858: a non-numeric character was found where a numeric was expected但查询(b)显示的数据包含NO SHIFT

的所有内容

该表的示例数据如下dateandtime字段:

05/04/2015 10:43
05/04/2015 16:52
05/04/2015 19:27
11/04/2009

请指导我正确的查询以及我做错了什么,相同的条件适用于TOAD

1 个答案:

答案 0 :(得分:1)

您可以将值转换为字符串并以字符串形式进行比较:

(case when to_char(dateandtime, 'HH24:MI') BETWEEN '00:00' and '14:30'
      then 'MORNING SHIFT'
      when to_char(dateandtime, 'HH24:MI') BETWEEN '14:31' and '23:59'
      then 'EVENING SHIFT'
      else 'NO SHIFT'
 end) as SHIFT