我试图在同一天的03:00 PM到12:00 AM之间显示时间。我该怎么做才能得到理想的结果?我不认为我的代码应该显示AM的任何内容,但确实如此。
select TO_CHAR(orig_time, 'HH:MI AM') from orig_table
WHERE TO_CHAR(orig_time, 'HH:MI AM') > '03:00 PM'
AND TO_CHAR(orig_time, 'HH:MI AM') < '12:00 AM'
ORDER BY TO_CHAR(orig_time, 'AM'), TO_CHAR(orig_time, 'HH:MI');
TO_CHAR(
--------
05:00 AM
05:15 AM
06:46 AM
07:00 AM
08:00 AM
08:30 AM
08:33 AM
09:00 AM
09:05 AM
10:00 AM
10:10 AM
TO_CHAR(
--------
11:25 AM
11:30 AM
11:45 AM
05:00 PM
05:45 PM
05:58 PM
08:30 PM
09:10 PM
10:25 PM
11:20 PM
答案 0 :(得分:2)
您的问题是您正在将值转换为字符类型,这意味着比较按字母顺序完成。这样,'05:00 AM'
大于'03:00 PM'
。
解决此问题的几种方法。一个是转换为角色,但使用24小时的时间:
select TO_CHAR(orig_time, 'HH:MI AM') from orig_table
WHERE TO_CHAR(orig_time, 'HH24:MI') > '15:00'
ORDER BY TO_CHAR(orig_time, 'HH24:MI');
请注意,您不需要在午夜之前以这种方式进行检查。
此外,你想在第二天将它扩展到1AM,你必须开始使用整个日期部分。此外,在这种情况下使用BETWEEN
关键字。
答案 1 :(得分:1)
如果你的意思是午夜
select numtodsinterval(orig_time-trunc(orig_time)) as time
from orig_table
WHERE numtodsinterval(orig_time-trunc(orig_time)) > interval '15' hour
/
在那里无需检查小时&lt; 24
如果你的意思是中午
select numtodsinterval(orig_time-trunc(orig_time),'day') as time
from orig_table
WHERE numtodsinterval(orig_time-trunc(orig_time),'day') between interval '12' hour and interval '15' hour
/
答案 2 :(得分:0)
select TO_CHAR(orig_time, 'HH:MI AM') from orig_table
WHERE TO_CHAR(orig_time, 'HH24:MI') > '15:00'
AND TO_CHAR(orig_time, 'HH24:MI:SS') <= '23:59:59'
ORDER BY TO_CHAR(orig_time, 'AM'), TO_CHAR(orig_time, 'HH:MI');