При создании таблицы я упомянул тип varchar2 для хранения даты. Теперь я не уверен в запросе Oracle для извлечения «от до - до настоящего времени».
До сих пор я пробовал этот запрос
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')
Одно дело, если у вас есть устаревшая таблица, но вам определенно не следует создавать новую таблицу для хранения даты как VARCHAR2.
Кроме того, к вашему сведению, я считаю, что функция EXTRACT()
возвращает ЧИСЛО, а не СИМВОЛ.
Когда ваша строка даты всегда форматируется как дд / мм / гггг, тогда один из способов получить месяц и год:
month = to_char(to_date(action_date,'dd/mm/yyyy'),'mm')
year = to_char(to_date(action_date,'dd/mm/yyyy'),'yyyy')
Синтаксис для between:
expression BETWEEN value1 AND value2;
Не уверен, какой выбор вы выбрали после данного примера запроса.
Если предположить, что 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'
is there any way to retrieve data only using month and year without mentioning date
Ты можешь сделать:
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
является параметром сеанса, поэтому каждый пользователь может его изменить, и он может не согласовываться между пользователями или даже сеансами пользователей.
Код ошибки 1843, состояние SQL 22008: ORA-01843: недействительный месяц
Я пробовал это, но получаю эту ошибку - Код ошибки 1843, состояние SQL 22008: ORA-01843: недействительный месяц. Есть ли другой способ получить дату из базы данных, и я использовал тип varchar2 для столбца.
@sujithraelumalai Обновлено.
Сэр, есть ли способ получить данные только с использованием месяца и года без указания даты
@sujithraelumalai Обновлено
varchar
. Это идея ужасный.