функция даты с oracle db

При создании таблицы я упомянул тип varchar2 для хранения даты. Теперь я не уверен в запросе оракула для извлечения «от даты до даты».

До сих пор я пробовал этот запрос

SELECT DSC_REF,EMP_NO, EMP_NAME, ACTION_DATE from DSC_UPLOAD 
WHERE ACTION_DATE Between (extract(month from to_date(ACTION_DATE,'dd/mm/yyyy')) = '02' 
                          (extract(month from to_date(ACTION_DATE,'dd/mm/yyyy')) = '03' 
AND extract(year from to_date(ACTION_DATE,'dd/mm/yyyy'))='2018') 

person sujithra elumalai    schedule 19.04.2018    source источник
comment
Никогда не сохраняйте даты в столбце varchar. Это ужасная идея.   -  person a_horse_with_no_name    schedule 19.04.2018
comment
Одно дело, если у вас есть устаревшая таблица, но вам определенно не следует создавать новую таблицу для хранения даты как VARCHAR2.   -  person David Faber    schedule 19.04.2018
comment
Кроме того, просто к вашему сведению, я считаю, что функция EXTRACT() возвращает ЧИСЛО, а не СИМВОЛ.   -  person David Faber    schedule 19.04.2018


Ответы (2)


Предполагая, что ACTION_DATE имеет тип данных DATE, тогда простой метод состоит в том, чтобы просто использовать литералы DATE:

SELECT DSC_REF,
       EMP_NO,
       EMP_NAME,
       ACTION_DATE
from   DSC_UPLOAD 
WHERE  ACTION_DATE >= DATE '2018-02-01'
AND    ACTION_DATE <  DATE '2018-04-01'

Если это строка (почему?), то:

SELECT DSC_REF,
       EMP_NO,
       EMP_NAME,
       ACTION_DATE
from   DSC_UPLOAD 
WHERE  TO_DATE( ACTION_DATE, 'dd/mm/yyyy' ) >= DATE '2018-02-01'
AND    TO_DATE( ACTION_DATE, 'dd/mm/yyyy' ) <  DATE '2018-04-01'

есть ли способ получить данные только с использованием месяца и года без указания даты

Ты можешь сделать:

WHERE  EXTRACT( MONTH FROM TO_DATE( ACTION_DATE, 'dd/mm/yyyy' ) ) IN ( 2, 3 )
AND    EXTRACT( YEAR  FROM TO_DATE( ACTION_DATE, 'dd/mm/yyyy' ) ) = 2018

Что касается вашего запроса, если ACTION_DATE является типом данных DATE, то:

to_date(ACTION_DATE,'dd/mm/yyyy')

Это плохая идея. TO_DATE( date_string [, format_string [, nls_string] ] ) имеет подпись, которая принимает от 1 до 3 строковых аргументов. Oracle постарается быть полезным и неявно преобразует вашу дату в строку, используя параметр сеанса NLS_DATE_FORMAT в качестве модели формата, и вы получите запрос, который эффективно:

TO_DATE(
  TO_CHAR(
    ACTION_DATE,
    (
      SELECT VALUE
      FROM   NLS_SESSION_PARAMETERS
      WHERE  PARAMETER = 'NLS_DATE_FORMAT'
    )
  ),
  'dd/mm/yyyy'
)

Если NLS_DATE_FORMAT не соответствует dd/mm/yyyy, вы получите исключение, а NLS_DATE_FORMAT является параметром сеанса, поэтому каждый пользователь может изменить его, и он может не совпадать между пользователями или даже сеансами пользователей.

person MT0    schedule 19.04.2018
comment
Код ошибки 1843, состояние SQL 22008: ORA-01843: недопустимый месяц - person sujithra elumalai; 19.04.2018
comment
Я пробовал это, но получаю эту ошибку: код ошибки 1843, состояние SQL 22008: ORA-01843: недопустимый месяц. Есть ли другой способ получить дату из базы данных, и я использовал тип varchar2 для столбца. - person sujithra elumalai; 19.04.2018
comment
@sujithraelumalai Обновлено. - person MT0; 19.04.2018
comment
Сэр, есть ли способ получить данные только с использованием месяца и года без указания даты - person sujithra elumalai; 19.04.2018
comment
@sujithraelumalai Обновлено - person MT0; 19.04.2018

Когда ваша строка даты всегда отформатирована как дд/мм/гггг, тогда один из способов получить месяц и год:

 month = to_char(to_date(action_date,'dd/mm/yyyy'),'mm')
 year  = to_char(to_date(action_date,'dd/mm/yyyy'),'yyyy')

Синтаксис между:

expression BETWEEN value1 AND value2;

Не уверен, какой выбор вы выбрали после данного примера запроса.

person Rene    schedule 19.04.2018