Oracle фильтр по дате

Как это сделать:

SESSION_START_DATE_TIME находится в формате ’12/01/2012 13: 16: 32.000 ‘

Я пробовал where To_Date (SESSION_START_DATE_TIME, ‘DD-MON-YYYY hh24:mi’) > To_Date (’12-Jan-2012 16:00′, ‘DD-MON-YYYY hh24:mi’ )

но независимо от того, что я пытаюсь, я получаю ошибку: SQL command not properly formed

В примере, который вы предоставили, нет ничего, что могло бы вызвать ошибку SQL command not properly formed . Как вы выполняете этот запрос? Что вы не показываете нам?

В этом примере script отлично работает:

Как и в этом примере:

Поэтому должно быть что-то еще, что не так.

615 просмотра

2 ответа

62 Репутация автора

На этот вопрос уже есть ответ здесь:

Моя таблица Oracle имеет 1000 наблюдений следующих 2 переменных: (оба поля varchar)

Я хотел бы отфильтровать даты. Я попробовал следующее, но безрезультатно .

Я продолжаю получать следующую ошибку .

Я что-то упустил очевидное?

Ответы (2)

2 плюса

5121 Репутация автора

По умолчанию NLS_DATE_FORMAT в настоящее время является DD-MON-RR. Таким образом, ваш столбец datecreate, определенный как строка, будет неявно преобразован в этот формат. Значение 12 не совпадает с DEC, поэтому ошибка. Либо вы используете правильный формат, либо конвертируете его в дату, аналогичную приведенной ниже.

2 плюса

25582 Репутация автора

Было подчеркнуто несколько раз, что в базах данных, DATE и TIME не должны храниться в виде строк. Тем не менее, каждый день возникает несколько вопросов, возникающих исключительно из-за этой плохой практики.

Обратите внимание, что в Oracle datetime может храниться как DATE тип или TIMESTAMP (с или без TIMEZONE ). DATE Тип содержит компонент времени , а также.

TO_DATE функция приходит нам на помощь в тех случаях, когда необходимо преобразовать строки даты. При использовании дат рекомендуется использовать стандартные DATE литералы в ‘YYYY-MM-DD’ формате, понятном большинству СУБД. (например: — DATE ‘2018-02-28’ ).

Кроме того, вам не нужно использовать ’28/02/2018 23:59:00′ или TRUNC функционировать для таких граничных случаев, когда вы можете использовать DATE литералы. Таким образом, ваш запрос может быть переписан как

или если вы знаете, что это високосный год.

Если вы действительно хотите считать до 23:59 минут, то TIMESTAMP литералы можно использовать с TO_TIMESTAMP функцией.

Я хотел бы знать, что вы думаете:

Я должен получить все соединения, которые у меня были с системой во время сеанса. Чтобы автоматизировать этот процесс, я решил использовать current_date%, который не будет работать, потому что current_date — это не строка, а функция.

Итак, мой вопрос, может ли кто-нибудь помочь мне с запросом, чтобы узнать количество всех соединений за текущий день.

Мой дерьмовый код:

2 ответа

Лучший способ (с точки зрения производительности) — использовать такую ​​логику:

Не все базы данных поддерживают стандартный синтаксис ISO / ANSI для дат, поэтому точное выражение в вашей базе данных может отличаться.

Вам нужно только connectiondate >= CURRENT_DATE :

, если тип данных connectiondate равен datetime .
Если это date , тогда подойдет простой connectiondate = CURRENT_DATE .

Оцените статью
Много толка
Добавить комментарий