显示时间之间的值

时间:2011-12-09 16:46:13

标签: sql oracle oracle10g sqlplus

我试图在同一天的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

3 个答案:

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