Функция даты с Oracle db

При создании таблицы я упомянул тип 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') 
Никогда сохраняет даты в столбце varchar. Это идея ужасный.
a_horse_with_no_name 19.04.2018 14:04

Одно дело, если у вас есть устаревшая таблица, но вам определенно не следует создавать новую таблицу для хранения даты как VARCHAR2.

David Faber 19.04.2018 14:07

Кроме того, к вашему сведению, я считаю, что функция EXTRACT() возвращает ЧИСЛО, а не СИМВОЛ.

David Faber 19.04.2018 14:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
54
2

Ответы 2

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

 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: недействительный месяц

sujithra elumalai 19.04.2018 14:45

Я пробовал это, но получаю эту ошибку - Код ошибки 1843, состояние SQL 22008: ORA-01843: недействительный месяц. Есть ли другой способ получить дату из базы данных, и я использовал тип varchar2 для столбца.

sujithra elumalai 19.04.2018 14:51

@sujithraelumalai Обновлено.

MT0 19.04.2018 14:52

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

sujithra elumalai 19.04.2018 15:10

@sujithraelumalai Обновлено

MT0 19.04.2018 15:14

Другие вопросы по теме