Oracle получает год из даты

Обновлено: 21.11.2024

Даты и время Oracle

Oracle поддерживает как дату, так и время, хотя и отличается от стандарта SQL2. Вместо того, чтобы использовать две отдельные сущности, дату и время, Oracle использует только одну, DATE. Тип DATE хранится в специальном внутреннем формате, который включает не только месяц, день и год, но также
час, минуту и ​​секунду.

Тип DATE используется так же, как и другие встроенные типы, такие как INT . Например, следующая инструкция SQL создает отношение с атрибутом типа DATE :

Формат ДАТЫ

Когда отображается значение DATE, Oracle должен сначала преобразовать это значение из специального внутреннего формата в печатную строку. Преобразование выполняется функцией TO_CHAR в соответствии с форматом DATE. Формат Oracle по умолчанию для DATE — "DD-MON-YY". Таким образом, при выполнении запроса вы увидите что-то вроде: Всякий раз, когда отображается значение DATE, Oracle автоматически вызывает TO_CHAR с форматом DATE по умолчанию. Однако вы можете переопределить поведение по умолчанию, явно вызвав TO_CHAR с вашим собственным форматом DATE. Например, возвращает результат: Общее использование TO_CHAR: где строка может быть сформирована из более чем 40 вариантов. Вот некоторые из наиболее популярных:
< /TR> .
MM Числовой месяц (например, 07 )
MON Сокращенное название месяца (например, JUL)
MONTH Полное название месяца (например, , ИЮЛЬ )
ДД День месяца (например, 24 )
DY Сокращенное название дня (например, FRI)
ГГГГ 4-значный год (например, 1998)
ГГ Последние 2 цифры года (например, 98)
RR То же, что и YY , но две цифры «округлены» до года в диапазоне от 1950 до 2049. Таким образом, например, 06 считается 2006 вместо 1906
AM (или PM ) Индикатор меридиана
ЧЧ Час дня ( 1–12 )
HH24 Час дня ( 0 - 23 )
MI Минута ( 0 - 59 )
SS Секунда ( 0 - 59 )

Вы только что узнали, как вывести значение DATE с помощью TO_CHAR . А как насчет ввода значения DATE? Это делается с помощью функции TO_DATE, которая преобразует строку в значение DATE, опять же в соответствии с форматом DATE. Обычно вам не нужно явно вызывать TO_DATE: всякий раз, когда Oracle ожидает значение DATE, он автоматически преобразует вашу входную строку, используя TO_DATE, в соответствии с форматом DATE по умолчанию "DD-MON-YY". Например, чтобы вставить кортеж с атрибутом DATE, вы можете просто ввести: В качестве альтернативы вы можете использовать TO_DATE явно: Общее использование TO_DATE: где строка имеет те же параметры, что и в TO_CHAR .

Наконец, вы можете изменить формат DATE по умолчанию в Oracle с "DD-MON-YY" на любой другой, выполнив в sqlplus следующую команду: Изменение действительно только для текущего сеанса sqlplus.

Текущее время

<УЛ>
  • Вы можете использовать двойные кавычки, чтобы сделать имена чувствительными к регистру (по умолчанию SQL нечувствителен к регистру) или ввести пробелы в именах. Oracle будет рассматривать все, что заключено в двойные кавычки, буквально как одно имя. В этом примере, если «Текущее время» не заключено в кавычки, оно будет интерпретировано как два нечувствительных к регистру имени CURRENT и TIME , что на самом деле вызовет синтаксическую ошибку.
  • DUAL — это встроенное отношение в Oracle, которое служит фиктивным отношением для включения в предложение FROM, когда ничего другого не подходит. Например, попробуйте " выбрать 1+2 из двойного; ".
  • Операции DATE

    Вы можете вычесть два значения DATE, и результатом будет число с плавающей запятой, которое представляет собой количество дней между двумя значениями DATE. Как правило, результат может содержать дробь, потому что DATE также имеет компонент времени. По очевидным причинам нельзя складывать, умножать и делить два значения DATE.

    Вы можете добавлять и вычитать константы из значения DATE, и эти числа будут интерпретироваться как количество дней. Например, SYSDATE+1 будет завтра. Вы не можете умножать или делить значения DATE.

    С помощью TO_CHAR строковые операции также можно использовать со значениями DATE. Например, to_char( , 'DD-MON-YY') как '%JUN%' оценивается как true, если это июнь. Первоначально этот документ был написан Кристианом Виджаей для класса CS145 профессора Джеффа Ульмана осенью 1997 года; отредактировано Джуном Яном для класса CS145 профессора Дженнифер Видом весной 1998 г .; дальнейшие изменения профессором Ульманом осенью 1998 г.

    EXTRACT извлекает и возвращает значение указанного поля даты и времени из выражения даты и времени или интервала. Выражение может быть любым выражением, результатом которого является тип данных datetime или interval, совместимый с запрошенным полем:

    Если запрашивается YEAR или MONTH, выражение expr должно оцениваться как выражение типа данных DATE , TIMESTAMP , TIMESTAMP WITH TIME ZONE , TIMESTAMP WITH LOCAL TIME ZONE или INTERVAL YEAR TO MONTH .

    Если запрашивается DAY, выражение expr должно оцениваться как выражение типа данных DATE , TIMESTAMP , TIMESTAMP WITH TIME ZONE , TIMESTAMP WITH LOCAL TIME ZONE или INTERVAL DAY TO SECOND .

    Если запрашивается HOUR , MINUTE или SECOND , выражение expr должно оцениваться как выражение типа данных TIMESTAMP , TIMESTAMP WITH TIME ZONE , TIMESTAMP WITH LOCAL TIME ZONE или INTERVAL DAY TO SECOND . DATE здесь недействителен, так как Oracle Database интерпретирует его как тип данных ANSI DATE, который не имеет полей времени.

    Если запрашивается TIMEZONE_HOUR , TIMEZONE_MINUTE , TIMEZONE_ABBR , TIMEZONE_REGION или TIMEZONE_OFFSET, выражение expr должно оцениваться как выражение типа данных TIMESTAMP WITH TIME ZONE или TIMESTAMP WITH LOCAL TIME ZONE .

    EXTRACT интерпретирует expr как тип данных даты и времени ANSI. Например, EXTRACT обрабатывает DATE не как унаследованную от Oracle DATE, а как ANSI DATE без элементов времени. Поэтому из значения DATE можно извлечь только YEAR , MONTH и DAY . Точно так же вы можете извлечь TIMEZONE_HOUR и TIMEZONE_MINUTE только из типа данных TIMESTAMP WITH TIME ZONE.

    Когда вы указываете TIMEZONE_REGION или TIMEZONE_ABBR (аббревиатура), возвращаемое значение представляет собой строку VARCHAR2, содержащую название или аббревиатуру соответствующего часового пояса. Когда вы указываете любое из других полей даты и времени, возвращаемое значение представляет собой целочисленное значение типа данных NUMBER, представляющее значение даты и времени в григорианском календаре. При извлечении из даты и времени со значением часового пояса возвращаемое значение находится в формате UTC. Чтобы получить список названий регионов часовых поясов и соответствующих им сокращений, запросите динамическое представление производительности V$TIMEZONE_NAMES.

    Эта функция может быть очень полезна для управления значениями полей даты и времени в очень больших таблицах, как показано в первом примере ниже.

    Названия часовых поясов необходимы для функции перехода на летнее время. Эти имена хранятся в двух типах файлов часовых поясов: одном большом и одном маленьком. Один из этих файлов является файлом по умолчанию, в зависимости от вашей среды и версии используемой вами базы данных Oracle. Дополнительные сведения о файлах и именах часовых поясов см. в Руководстве по поддержке глобализации баз данных Oracle.

    Некоторые сочетания поля даты и времени и выражения значения даты и времени или интервала приводят к неоднозначности. В этих случаях Oracle Database возвращает UNKNOWN (дополнительную информацию см. в следующих примерах).

    Руководство по поддержке глобализации базы данных Oracle для полного списка названий регионов часовых поясов в обоих файлах

    "Арифметика даты и времени/интервала" для описания datetime_value_expr и interval_value_expr

    Справочник по базе данных Oracle для получения информации о динамических представлениях производительности

    В следующем примере из таблицы oe.orders возвращается количество заказов, размещенных в каждом месяце:

    В следующем примере возвращается 1998 год.

    В следующем примере из примера таблицы hr.employees выбираются все сотрудники, нанятые после 2007 года:

    Следующий пример приводит к неоднозначности, поэтому Oracle возвращает UNKNOWN :

    Неоднозначность возникает из-за того, что в выражении указано числовое смещение часового пояса, и это числовое смещение может соответствовать более чем одному названию региона часового пояса.

    Функция Oracle EXTRACT() извлекает определенный компонент (год, месяц, день, час, минуту, секунду и т. д.) из значения даты и времени или интервала.

    Синтаксис

    Следующее иллюстрирует синтаксис функции Oracle EXTRACT():

    Аргументы

    Функция Oracle EXTRACT() принимает два аргумента:

    1) поле

    Аргумент field указывает извлекаемый компонент.

    2) источник

    Исходным аргументом является значение DATE , INTERVAL или TIMESTAMP, из которого извлекается поле.

    В следующей таблице показано, какие поля можно извлечь из того или иного типа значения.

    < td>ГОД, МЕСЯЦ, ДЕНЬ
    Тип значенияДоступные поля
    ДАТА
    ИНТЕРВАЛ ОТ МЕСЯЦАГОД, МЕСЯЦ
    ИНТЕРВАЛ ДЕНЬ ДО ВТОРОЙДЕНЬ, ЧАС, МИНУТА, СЕКУНД
    TIMESTAMPГОД, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНД

    Обратите внимание, что функция EXTRACT() вернет UNKNOWN, если комбинация поля и источника приводит к неоднозначности.

    Возвращаемое значение

    Функция EXTRACT() возвращает значение поля источника.

    Примеры

    A) Извлечение полей из значений DATE

    Вы можете извлечь ГОД, МЕСЯЦ, ДЕНЬ из значения ДАТЫ с помощью функции ИЗВЛЕЧИТЬ().

    В следующем примере извлекается значение поля YEAR из значения DATE.

    В этом примере мы использовали функцию TO_DATE() для преобразования литерала даты в значение DATE.

    Вот результат

    Аналогичным образом вы можете извлечь значения других полей, как показано ниже:

    Извлечение месяца из даты:

    Извлечение дня из даты:

    Чтобы извлечь значения из полей HOUR, MINUTE и SECOND, используйте функцию TO_CHAR().

    Например, чтобы извлечь часы, минуты и секунды из текущей системной даты, используйте следующую инструкцию:

    B) Извлечение полей из значений INTERVAL YEAR TO MONTH

    Для ИНТЕРВАЛА ГОД ДО МЕСЯЦА вы можете извлечь только поля ГОД и МЕСЯЦ.

    Предположим, у вас есть следующий интервал:

    5 лет 2 месяца.

    Чтобы извлечь значение поля года, используйте следующий оператор:

    В следующем примере значение поля месяца извлекается из интервала:

    Вот результат:

    C) Извлечение полей из значений INTERVAL DAY TO SECOND

    Для ИНТЕРВАЛА ДЕНЬ-СЕКУНД вы можете извлечь ДЕНЬ, ЧАС, МИНУТУ и СЕКУНДУ, как показано в следующем примере:

    Извлечь день из интервала

    Извлечь час из интервала

    Извлечь минуты из интервала

    Извлечь секунды из интервала

    D) Извлечение полей из значений TIMESTAMP

    Вы можете извлечь ГОД, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТУ и СЕКУНДУ из значения TIMESTAMP, как показано в следующих примерах:

    Извлечение года из метки времени:

    Извлечение месяца из метки времени:

    Извлечение дня из метки времени:

    Извлечение часа из метки времени:

    Извлечение минут из метки времени:

    Извлечение секунды из метки времени:

    E) Извлечение компонентов даты из данных таблицы

    См. следующую таблицу заказов из примера базы данных:

    Следующий оператор использует функцию EXTRACT() для извлечения года и месяца из даты заказа и возврата количества заказов в месяц:

    F) Извлечение даты из пользовательского ввода

    Следующий оператор пытается извлечь год, месяц и день из даты, введенной пользователем:

    Однако Oracle выдает ошибку:

    Чтобы исправить эту ошибку, необходимо преобразовать введенную дату в значение даты с помощью функции TO_DATE. Предположим, что формат даты ввода ГГГГММДД :

    И когда вы вводите дату ввода как 20191126 , результат будет следующим:

    В этом руководстве вы узнали, как использовать функцию Oracle EXTRACT() для извлечения значения указанного поля значения даты и времени.

    Я пытаюсь создать запрос, который получает только год из выбранных дат. т.е. выберите ASOFDATE из PSASOFDATE; возвращает 15.11.2012, а я хочу только 2012. Как я могу получить только год? Я знаю, что можно использовать функцию ГОД, но не знаю, как это сделать.

    Пометка вопроса изменена с mysql на oracle. Это внесло некоторую путаницу в эти вопросы и ответы. Зная это, ответы становятся намного менее удивительными.

    5 ответов 5

    Это сработало для меня:

    Как насчет этого?

    @Juan Я согласен с тобой, Хуан. Хороший ответ. Совершенно нормально использовать строку, когда вы последовательно используете 4-значный год. Если вы добавляете день и/или месяц и хотите выполнить СОРТИРОВКУ, отсортируйте по столбцу даты или по строке to_char с форматом «ГГГГ/ММ/ДД» или подобным форматом, чтобы получить правильный порядок.

    просто передайте columnName как параметр YEAR

    другой вариант — использовать DATE_FORMAT

    ОБНОВЛЕНИЕ 1

    Бьюсь об заклад, это значение varchar в формате ММ/дд/ГГГГ, так оно и есть,

    ПОСЛЕДНЕЕ СРЕДСТВО, если все запросы не пройдены

    та же ошибка отображалась и для второго запроса. Я не уверен, что это за тип данных.. позвольте мне попытаться получить его..

    @StackOver, посмотрите мой обновленный ответ, формат вашей даты - M/d/Y, верно? попробуйте вернуть его в актуальное состояние.

    ВЫБРАТЬ date_column_name FROM table_name WHERE EXTRACT(YEAR FROM date_column_name) = 2020

    Редактировать: из-за пост-тега "оракул" первые два запроса становятся неактуальными, оставляя третий запрос для оракула.

    Отредактировано: в любом случае, если ваша дата представляет собой строку, давайте преобразуем ее в правильный формат даты. И выберите из него год.

    Поскольку вы пробуете Toad, не могли бы вы проверить следующий код:

    Чтобы лучше понять манипуляции с датой и временем, ознакомьтесь с этой ссылкой. Надеюсь, это поможет в долгосрочной перспективе :)

    Полагаю, это потому, что я неправильно написал название вашей таблицы. можете ли вы попробовать DATE (столбец даты) и правильное имя столбца и имя таблицы :)

    Извините, меня разъединили.Кажется, вы проголосовали за ответ Джона Ву. Так это сработало для вас? Честно говоря, важно разобраться в проблеме, с которой вы столкнулись. Мне больше любопытно узнать, получаете ли вы по-прежнему ошибку, если нет, то какой ответ решил эту проблему и дал вам правильные результаты.

    Первые два запроса относятся к MySQL, третий — к Oracle. Поскольку вопрос помечен тегом oracle, это вводит в заблуждение и должно быть явно указано в вопросе.

    Читайте также: