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 вариантов. Вот некоторые из наиболее популярных:MM | Числовой месяц (например, 07 ) |
MON | Сокращенное название месяца (например, JUL) |
MONTH | Полное название месяца (например, , ИЮЛЬ ) |
ДД | День месяца (например, 24 ) |
DY TD> | Сокращенное название дня (например, FRI) |
ГГГГ | 4-значный год (например, 1998) | < /TR>
ГГ | Последние 2 цифры года (например, 98) |
RR | То же, что и YY , но две цифры «округлены» до года в диапазоне от 1950 до 2049. Таким образом, например, 06 считается 2006 вместо 1906 | .
AM (или PM ) | Индикатор меридиана |
ЧЧ | Час дня ( 1–12 ) | TR>
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.
Текущее время
<УЛ>Операции 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, это вводит в заблуждение и должно быть явно указано в вопросе.
Читайте также: