我在Oracle中有一个表,其中从不同的源插入数据。在2014年,我们发现有些消息来源没有插入带有日期的时间戳,但我们修复了它们,现在所有来源都以适当的格式插入数据,例如05/04/2015 4:30:42 PM
使用SQL查询,我们希望将数据分为3种类型,早班,晚班和无班次(对于没有时间戳的数据)。
上午班次将在00:00:00
和14:30:00
夜班将在14:31:00
和23: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
。
答案 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