Как выбрать максимальную дату в sql oracle

Обновлено: 04.07.2024

Все ниже рассмотренные функции работают с календарными типами данных.

Получение текущей даты и времени.

Чтобы получить текущую дату и время используется функция NOW ().

SELECT NOW ()
Результат: 2015-09-25 14:42:53

Для получения только текущей даты есть функция CURDATE ().

SELECT CURDATE ()
Результат: 2015-09-25

И функция CURTIME (), которая возвращает только текущее время:

SELECT CURTIME ()
Результат: 14:42:53

Функции CURDATE () и NOW () удобно использовать для добавления в базу данных записей, для которых требуется хранить дату добавления. Например, при добавлении статьи на сайт хорошо бы хранить ее дату публикации. Тогда запрос на добавление статьи в базу будет примерно таким:

Прибавление и вычитание дат и времени

Функция ADDDATE (date, INTERVAL value) прибавляет к дате date значение value и возвращает полученное значение. В качестве value могут выступать следующие значения:

  • SECOND — секунды
  • MINUTE — минуты
  • HOUR — часы
  • DAY — дни
  • WEEK — недели
  • MONTH — месяцы
  • QUARTER — кварталы
  • YEAR — годы

а также их комбинации:

  • MINUTE_SECOND — минуты и секунды
  • HOUR_SECONDчасы — минуты и секунды
  • HOUR_MINUTE — часы и минуты
  • DAY_SECOND — дни, часы, минуты и секунды
  • DAY_MINUTE — дни, часы и минуты
  • DAY_HOUR — дни и часы
  • YEAR_MONTH — года и месяцы.

Функция SUBDATE (date, INTERVAL value) производит вычитание значения value из даты date . Пример:

Функция PERIOD_ADD (period, n) прибавляет к значению period n месяцев. Значение период должно быть представлено в формате YYYYMM (например сентябрь 2015 года будет 201509). Пример:

SELECT PERIOD_ADD (201509, 4)
Результат: 201601

Функция TIMESTAMPADD (interval, n, date) прибавляет к дате date временной интервал n , значения которого задаются параметром interval . Возможные значения параметра interval:

  • FRAC_SECOND — микросекунды
  • SECOND — секунды
  • MINUTE — минуты
  • HOUR — часы
  • DAY — дни
  • WEEK — недели
  • MONTH — месяцы
  • QUARTER — кварталы
  • YEAR — годы

Функция SUBTIME (date, time) вычитает из даты date время time. Пример:

Вычисление интервала между датами

Функция TIMEDIFF (date1, date2) вычисляет разницу в часах, минутах и секундах между двумя датами date1 и date2 . Пример:

Функция DATEDIFF (date1, date2) вычисляет разницу в днях между двумя датами, при этом часы, минуты и секунды при указании дат игнорируются. Пример:

С помощью этой функции легко определить сколько дней прошло с даты публикации статьи:

SELECT DATEDIFF (CURDATE (), date_publication) FROM posts WHERE id_post = 1

Функция PERIOD_DIFF (period1, period2) вычисляет разницу в месяцах между двумя датами. Даты должны быть представлены в формате YYYYMM . Например, узнаем сколько месяцев прошло с января 2015 по сентябрь 2015:

SELECT PERIOD_DIFF (201509, 201501)
Результат: 9

Функция TIMESTAMPDIFF (interval, date1, date2) вычисляет разницу между датами date2 и date1 в единицах указанных в параметре interval . При этом interval может принимать следующие значения:

  • FRAC_SECOND — микросекунды
  • SECOND — секунды
  • MINUTE — минуты
  • HOUR — часы
  • DAY — дни
  • WEEK — недели
  • MONTH — месяцы
  • QUARTER — кварталы
  • YEAR — годы

Получение различных форматов даты и времени и другой информации

Функция DATE (datetime) возвращает дату, отсекая время. Пример:

Функция TIME (datetime) возвращает время, отсекая дату. Пример:

Функция TIMESTAMP (date) возвращает полный формат со временем даты date . Пример:

DAY (date) и DAYOFMONTH (date). Функции-синонимы, которые возвращают порядковый номер дня месяца. Пример:

Функции DAYNAME (date), DAYOFWEEK (date) и WEEKDAY (date). Первая функция возвращает название дня недели, вторая — номер дня недели (отсчет от 1 — воскресенье до 7 — суббота), третья также номер дня недели только другой отсчет(отсчет от 0 — понедельник, до 6 — воскресенье). Пример:

Функции WEEK (date) и WEEKOFYEAR (datetime). Обе функции возвращают номер недели в году, только у первой неделя начинается с воскресенья, а у второй с понедельника. Пример:

Функция MONTH (date) возвращает числовое значение месяца (от 1 до 12), а MONTHNAME (date) название месяца. Пример:

Функция QUARTER (date) возвращает номер квартала года (от 1 до 4). Пример:

Функция YEAR (date) возвращает значение года (от 1000 до 9999). Пример:

Функция DAYOFYEAR (date) возвращает порядковый номер дня в году (от 1 до 366). Прмиер:

Функция HOUR (datetime) возвращает значение часа (от 0 до 23). Пример:

Функция MINUTE (datetime) возвращает значение минут (от 0 до 59). Пример:

Функция SECOND (datetime) возвращает значение секунд (от 0 до 59). Пример:

Функция EXTRACT (type FROM date) возвращает часть даты date определяемую параметром type . Пример:

Взаимообратные функции TO_DAYS (date) и FROM_DAYS (n). Первая преобразует дату в количество дней, прошедших с нулевого года. Вторая, наоборот, принимает число дней, прошедших с нулевого года и преобразует их в дату. Пример:

Взаимообратные функции UNIX_TIMESTAMP (date) и FROM_UNIXTIME (n). Первая преобразует дату в количество секунд, прошедших с 1 января 1970 года. Вторая, наоборот, принимает число секунд, с 1 января 1970 года и преобразует их в дату. Пример:

Взаимообратные функции TIME_TO_SEC (time) и SEC_TO_TIME (n). Первая преобразует время в количество секунд, прошедших от начала суток. Вторая, наоборот, принимает число секунд с начала суток и преобразует их во время. Пример:

Функция MAKEDATE (year, n) принимает год year и номер дня в году n и преобразует их в дату. Пример:

В этой части вы увидите использование функции SQL MAX () для типа даты столбца таблицы.

Пример:

Пример таблицы: заказы

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

SQL MAX () для значения даты с помощью где

Чтобы получить данные «ord_num», «ord_amount», «ord_date», «agent_code» из таблицы «orders» при следующих условиях:

1. «ord_date» равно максимальному «ord_date»,

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

SQL MAX () на дату с группировкой по

Чтобы получить данные «agent_code» и максимального значения «ord_date» с заданным пользователем псевдонимом столбца «Max Date» для каждого агента из таблицы заказов со следующим условием:

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

SQL MAX () на значение даты с подзапросом

Чтобы получить данные «agent_code», «ord_date» и «cust_code» из таблицы «orders» при следующих условиях:

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

SQL MAX () для значения даты с использованием соединения

Пример таблицы: заказы

Пример таблицы: отправка

1. «ord_date» должно быть наибольшим (максимальным) из таблицы «orders»,

2. наибольшее (максимальное) значение ord_date должно быть равно таблице ord_date of orders,

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

Примечание. Выводы указанного оператора SQL, показанного здесь, взяты с использованием Oracle Database 10g Express Edition.

Вот слайд-презентация всех агрегатных функций.

Упражнения по SQL

  • Упражнения по SQL, практика, решение
  • SQL Получить данные из таблиц [33 Упражнения]
  • Булевы и реляционные операторы SQL [12 упражнений]
  • Подстановочные знаки SQL и специальные операторы [22 упражнения]
  • Агрегатные функции SQL [25 упражнений]
  • Вывод запроса форматирования SQL [10 упражнений]
  • SQL-запросы к нескольким таблицам [7 упражнений]
  • ФИЛЬТРАЦИЯ И СОРТИРОВКА в базе данных персонала [38 упражнений]
  • SQL СОЕДИНЯЕТ
    • SQL СОЕДИНЯЕТСЯ [29 упражнений]
    • SQL присоединяется к базе данных HR [27 упражнений]
    • ПОДПИСИ SQL [39 упражнений]
    • SQL ПОДПИСИ по базе данных HR [55 упражнений]
    • ОСНОВНЫЕ запросы к базе данных фильмов [10 упражнений]
    • ПОДПИСКИ на фильм База данных [16 упражнений]
    • ПРИСОЕДИНЯЕТСЯ к базе данных фильма [24 упражнения]
    • Вступление
    • ОСНОВНЫЕ запросы по футболу базы данных [29 упражнений]
    • ПОДПИСКИ по футбольной базе данных [33 упражнения]
    • ПРИСОЕДИНЯЕТСЯ к запросам по футбольной базе данных [61 упражнений]
    • Вступление
    • ОСНОВНЫЕ, ПОДПИСИ И СОЕДИНЕНИЯ [39 упражнений]
    • ОСНОВНЫЕ запросы к базе данных сотрудников [115 упражнений]
    • БРОНИРОВАНИЕ на сотрудника База данных [77 Упражнения]

    Хотите улучшить вышеуказанную статью? Вносите свои заметки / комментарии / примеры через Disqus.

    Как правильно вытащить максимальную дату для каждого LOAN_ID.

    У меня есть таблица:

    Необходимо вытащить для каждого ID вытащить максимальную дату по LOAN_ID.
    т.е. в итоге должна получиться только одна строчка с LOAN_ID и date с максимальной датой

    Пытаюсь сделать таким кодом , но запрос не корректный

    __________________
    Помощь в написании контрольных, курсовых и дипломных работ здесь

    Данные за Максимальную дату
    Запрос select distinct p.t,t.kk,t.rt,t.date from tab t join ( select 1 t, 1 d1.

    Выбрать максимальную дату
    Есть таблица с тремя полями: - numeric - varchar - datetime. Пример нескольких строк: 1.

    Как оставить максимальную дату из группировки
    Здравствуйте. Подскажите как отобрать из исходной таблицы(3 колонки: FIO, Model, Data) данные.

    Получить для каждого элемента максимальную дату и цену, соответствующую этой дате
    Нужен такой хитрейший запрос: Вот есть скажем таблица: Element DDoc Price 1 01.01.01 .

    А если же надо только loan_id и дата, то только подзапрос(с group by) Вам и нужен

    запрос вывести максимальную сумму
    очень нужна ваша подсказка Вывести название проекта и самой затратной по стоимости работы в нем. У.

    Как выбрать максимальную дату в множества лицевых
    Всем привет. Не могу сообразить, как выбрать максимальную дату начисления для каждого лицевого по.


    Найти максимальную дату среди значений в одной ячейке
    Добрый день! Помогите, пожалуйста, написать функцию (или формулу, если это возможно), чтобы.

    Файл содержит записи о дате. Указать максимальную дату для второй половины года
    Помогите с решением Создать файл, содержащий записи о дате: день (1..31), месяц (1..12), год.

    Запрос на дату
    Требуется создать запрос для формы, который будет автоматически выводить книги не сданные вовремя.

    запрос на дату
    Привет все може кто подскажет, как можно одним запросом вывести дату из таблицы(в поле стоит.

    У меня есть таблица, которая представляет собой набор записей о том, когда пользователь вошел в систему.

    Как мне создать запрос, который даст мне самую последнюю дату для каждого пользователя?

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

    Какую базу данных вы используете? MySQL, SQL-сервер, Oracle, . Вам нужно значение, которое соответствует самой последней дате, или максимальное значение И максимальная дата? При работе с postgresql эта версия будет быстрее, чем использование IN (подзапроса) вместо внутреннего соединения? @ По моему опыту, использование внутреннего соединения происходит быстрее, чем в состоянии @ RedFilter Это отлично сработало для моей проблемы. Большое спасибо за такой технический запрос. Кстати, я использовал datetime вместо date, чтобы избежать получения нескольких результатов для конкретной даты почему вам нужно 'и t.date = tm.MaxDate' не будет достаточно группировки?

    Использование оконных функций (работает в Oracle, Postgres 8.4, SQL Server 2005, DB2, Sybase, Firebird 3.0, MariaDB 10.3)

    Стоит уточнить, какой продукт / версия Sybase. Это не работает на Sybase ASE 16. Большим преимуществом этого подхода является то, что он гарантированно всегда возвращает только одну строку на раздел ( username в данном случае) и даже не требует уникального поля "orderable" (например, присоединение max(date) в других ответах). Просто чтобы добавить что-то к тому, что сказал @MarcoRoy, если у вас есть более одной записи с одной и той же максимальной датой, если вы измените запрос, например, когда вы отлаживаете его, другая запись может получить номер строки 1, поэтому результаты могут быть противоречивыми. Но если вам действительно все равно, тогда это не должно быть проблемой. Это может быть решено, если вы добавите PK после даты. Например: order by date desc, id desc) .

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

    Просто вы можете достичь этого путем:

    на самом деле это работает только для дубликатов, если у вас есть более 2 значений, условие a.date <b.date не работает, то есть это не общее решение, хотя идея работы с LEFT OUTER JOIN является важной вещь в этом ответе. Интересно, что Sybase ASE 16 отлично работает для небольших таблиц (<10k строк), но с большими (> 100k строк) он работает . Я думал, что это будет идеальный пример реляционных БД, которые должны преуспеть в . @levantpied . Да, объединение влево стоит дорого на больших наборах данных. Вы можете настроить производительность, поместив условие фильтра в само соединение, чтобы по возможности обработать его.

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

    Помните, что это даст вам дубликаты, если для конкретного пользователя существует более одной записи с одинаковой датой. Вы можете или не можете этого хотеть. Этот sql медленный в Oracle с предложением in, он не будет использовать индекс Хотя это еще одно возможное решение, обычно это не очень хороший способ решить эту проблему. Это приведет к тому, что внутренний запрос будет выполнен один раз для каждого имени в таблице, что приведет к значительному замедлению для любой таблицы значительного размера. Выполнение отдельного запроса, в котором нет элемента из первого запроса в предложении where, а затем объединение двух таблиц обычно выполняется быстрее. Это действительно хорошая возможность быть одним из наиболее понятных решений, которые не зависят от конкретной реализации.

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

    Другое преимущество заключается в том, что используемый синтаксис очень прост и что значение запроса довольно легко понять (возьмите все строки так, чтобы не было более новой строки для рассматриваемого имени пользователя).

    Литералы служат для непосредственного представления данных, ниже приведен список
    стандартных литерал:

    Двойной апостроф интерпретируется в строковой литерале как апостроф в тексте.

    Интервал времени

    Синтаксис и реализация интервалов отличается на разных СУБД.

    Oracle

    PostgreSQL

    интервалы указываются в виде строки, в которой перечисляются значение и тип промежутка:

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

    MySQL

    Только сложные интервалы, состоящие из более одного типа промежутков, указываются в строке.
    Для этих целей введены дополнительные по сравнению с PostgreSQL имена для промежутков:

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

    Выражения и операции

    cтроковые операции

    алгебраические операции

    Ко времени можно прибавлять целое число, но результат зависит от конкретной СУБД.

    операции отношения

    логические операции и предикаты

    выражение IN (значение1. значениеn)

    В качестве множества значений может служить корректная выборка

    условные выражения

    Ниже приведен пример использования выражения в запросе выбора данных.

    прочие операции

    В каждой СУБД свой набор операций, выше были приведены наиболее употребительные.
    Например, в PosgreSQL можно использовать и такие операции:

    Обзор функций

    математические функции

    Тригонометрические функции работают с радианами:

    строковые функции

    работа с датами

    В рассматриваемых СУБД для обработки времени мало общего. Самый минимум у Oraсle:

    Ниже приведены допустимые форматы в строковом параметре s для функций trunc и date_trunc соответственно:

    Такие функции как last_day в других СУБД реализуются с помощью арифметики времени и преобразования типов.
    Так что при желании можно написать соответствующую функцию. Ниже приведена выборка последнего дня указанной даты.

    Преобразование типов

    Множество типов разрешенные для преобразования в констркуции CAST AS определяется
    реализацией СУБД. Так в MySQL может преобразовать только следующие типы: binary[(n)],
    char[(n)], date, datetime, decimal[(m[,d])], signed [integer], time, unsigned [integer].
    А в Oracle, кроме преобразования встроенных типов, можно преобразовывать выборки со
    множеством записей в массивы.

    В PostgreSQL более расширенные возможности по преобразованию. Во-первых, можно добавить
    собственное преобразование для встроенных и пользовательских типов. Во-вторых, есть
    собственный более удобный оператор преобразования типов .

    В большинстве случае необходимо преобразование в строку либо из строки. Для этого случаяСУБД предоставляют дополнительные функции.

    функции Oracle

    Формат числовой строки задается следующими элементами:

    функции PostgreSQL

    Основные элементы форматирования совпадают с Oracle.

    функции MySQL

    При хранении даты в MySQL под типом Date (), она имеет формат 2011-07-11 (год-месяц-день). В некоторых случаях даже не имея разделителя 20110711.

    Поскольку в русскоязычных странах более привычным к восприятию считается формат 11.07.2011 (день.месяц.год), то при выводе даты из базы данных, возникает необходимость в её преобразовании.

    Преобразовать дату можно несколькими способами.

    1. при помощи php кода
    2. воспользовавшись командой DATE_FORMAT () при выборке из базы.

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

    Второй способ применим во всех случаях, вне зависимости сколько записей необходимо извлечь из базы, при этом он осуществляет минимальную нагрузку на сервер в отличии от способа с php кодом.

    Рассмотрим пример выполнения:

    Допустим существует таблица message , которая содержит ячейку send_data с датой в формате 2011-07-11 .

    Для извлечения и преобразования даты напишем следующий код:

    Далее в том месте где необходимо вывести преобразованную дату, выводим массив $message любой, удобной для вас командой:

    к примеру если в send_data находится 2011-05-03 то мы получим 03.05.2011 .

    Номер индекса в массиве $message указываем каким по счету начиная от 0, в команде SELECT извлекается необходимое значение с преобразованной датой. К примеру при запросе:

    вывод даты будет осуществляться с индексом 2:

    Преобразовать дату при помощи DATE_FORMAT() можно в любой вид и очередность при помощи подстановки ключей.

    Ниже приведен список основных элементов форматирования для даты и времени:

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