Предполагая, что 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
varchar
. Это ужасная идея. - person a_horse_with_no_name   schedule 19.04.2018EXTRACT()
возвращает ЧИСЛО, а не СИМВОЛ. - person David Faber   schedule 19.04.2018