Отображение значений между временами - PullRequest
1 голос
/ 09 декабря 2011

Я пытаюсь отобразить время между 03:00 и 12:00 в течение того же дня. Что я могу сделать, чтобы получить желаемые результаты? Я не думаю, что мой код должен отображать что-либо с 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 ]

2 голосов
/ 09 декабря 2011

Ваша проблема в том, что вы конвертируете значения в тип символа, что означает, что сравнения выполняются в алфавитном порядке. Таким образом, '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');

Обратите внимание, что вам не нужно проверять до полуночи, поступая таким образом.

Кроме того, вы хотите расширить его, скажем, до 1:00 следующего дня, вам придется начать использовать целую часть дат. Также в этом случае используйте ключевое слово BETWEEN.

1 голос
/ 09 декабря 2011

Если вы имеете в виду полночь

select numtodsinterval(orig_time-trunc(orig_time)) as time
from orig_table
WHERE numtodsinterval(orig_time-trunc(orig_time)) > interval '15' hour
/

, где нет необходимости проверять час <24 </p>

Если вы имеете в виду полдень

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
/
0 голосов
/ 09 декабря 2011
    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');
...