Oracle округлить дату до месяца
Функция SYSDATE
Функция SYSDATE возвращает текущую дату и время по часам сервера.
Пример:
SELECT SYSDATE FROM dual;
Функция ADD_MONTHS (d, x)
Возвращает дату, полученную в результате прибавления к дате d одного или нескольких месяцев. Количество месяцев задается параметров x, причем x может быть отрицательным — в этом случае указанное количество месяцев вычитается из заданной даты.
Пример:
SELECT SYSDATE d, ADD_MONTHS ( SYSDATE , 5) d1, ADD_MONTHS ( SYSDATE , -5) d2 FROM dual;
Функция LAST_DAY (d)
Возвращает последнее число месяца, указанного в дате d.
Пример:
SELECT SYSDATE d, LAST_DAY ( SYSDATE ) d1 FROM dual;
Функция MONTHS_BETWEEN (d1, d2)
Функция MONTHS_BETWEEN возвращает количество месяцев между двумя датами d1 и d2 с учетом знака как d1-d2, возвращаемое число является дробным.
SELECT MONTHS_BETWEEN ( '2.09.2011' , '2.05.2010' ) d1, MONTHS_BETWEEN ( '12.09.2017' , '2.05.2012' ) d2, MONTHS_BETWEEN ( '2.05.2018' , '12.09.2015' ) d3
FROM dual;
Функция TRUNC (d[,mask])
Производит усечение указанной даты в соответствии с маской. Если маска не указана, то усечение производится до даты (время отбрасывается).
Пример:
SELECT SYSDATE d1, TRUNC ( SYSDATE ) d2 FROM dual;
Усечение даты до часов, дней, месяца и года. Форматная маска по умолчанию равна «DD»
SELECT SYSDATE d1,
TRUNC ( SYSDATE , 'HH24' ) d2,
TRUNC ( SYSDATE , 'DD' ) d3,
TRUNC ( SYSDATE , 'MM' ) d4,
TRUNC ( SYSDATE , 'YYYY' ) d5
FROM dual;
Функция ROUND (d[,mask])
Функция ROUND аналогична TRUNC , но вместо усечения она производит округление. Форматная маска по умолчанию равна 'DD' .
Пример:
SELECT SYSDATE d1,
ROUND ( SYSDATE ) d2,
ROUND ( SYSDATE , 'HH24' ) d3,
ROUND ( SYSDATE , 'DD' ) d4,
ROUND ( SYSDATE , 'MM' ) d5,
ROUND ( SYSDATE , 'YYYY' ) d6
FROM dual;
Форматные маски для функций TRUNC и ROUND :
СС - Первый день столетия
YEAR, YYYY, YY, Y - Первый день года
Q - Первый день квартала
MONTH, MON, MM - Первый день месяца
WW - Тот же день недели, что и первый день текущего года
W - Тот же день недели, что и первый день текущего месяца
DDD, DD - День
DAY, DY, D - Первый день недели
HH, HH12, HH24 - Час
MI - Минута
Функция TO_DATE (str[,mask [,nls_lang]])
Функция TO_DATE преобразует строку str в дату. Преобразование ведется по маске mask, если она указана. Если маска не указана, то берется маска по умолчанию. В случае указания маски можно указать еще один параметр — язык, используемый при форматировании названий месяцев и дней. В случае ошибки анализа строки str в соответствии с заданной маской возникает исключительная ситуация. Наиболее распространенная ошибка «ORA-01830: шаблон формата даты завершается перед преобразованием всей строки ввода». Кроме того, нередко встречается ошибка «ORA-01821: формат даты не распознан» — она возникает при указании недопустимой форматной маски.
Пример:
SELECT TO_DATE ( '12.09.2006' ) d FROM dual;
Функция TO_CHAR (d[,mask])
Преобразует дату d в символьную строку в соответствии с заданной маской. В случае указания недопустимой маски возникает исключительная ситуация «ORA-01821: формат даты не распознан».
Пример:
SELECT SYSDATE d1, TO_CHAR ( SYSDATE , 'DD.MM.YY HH24:MI' ) d2 FROM dual;
Форматные маски функции TO_CHAR :
СС - Столетие.
SСС - Столетие, перед датами до нашей эры ставится знак «минус».
YYYY - Год.
SYYYY - Год, перед датами до нашей эры ставится знак «минус».
YYY, YY, Y - Год, последние 3,2 или 1 цифры года.
SYEAR, YEAR - Год, записанный прописью c учетом текущего национального языка.
Q - Номер квартала.
MM - Месяц.
RM - Номер месяца, записанный с имитацией римских цифр при помощи символов X и I.
MONTH - Название месяца прописью.
MON - Название месяца прописью в сокращенном до трех символов виде.
WW - Неделя года.
W - Неделя месяца.
DDD - День года.
DD - День месяца.
D - День недели.
DAY - День недели прописью, при необходимости дополняется до девяти символов пробелами.
DY - День недели прописью, сокращенный до трех символов.
J - Дата юлианского календаря. Является числом дней от 1.01.4712 до нашей эры.
HH24 - Час дня по 24-часовой шкале (0-23).
HH12, HH - Час дня по 12-часовой шкале (1-12).
AM, PM - Вывод признака «до полудня» — AM и «после полудня» — PM. Указание AM и PM в форматной маске равнозначно.
MI - Минуты (0-59).
SS - Секунды (0-59).
SSSSS - Количество секунд после полуночи.
-/. ; - Знаки пунктуации. Они выводятся в соответствующие места отформатированной даты.
SP - Форматный суффикс. Его добавление к элементу форматной маски, возвращающему число, приводит к форматированию этого числа прописью.
Дает результат 95 - это то, что вы ожидаете от расчета.
SELECT trunc((TO_DATE ('06/06/2009 16:00:00', 'DD/MM/YYYY HH24:MI:SS') - TO_DATE ('06/06/2009 14:25:00', 'DD/MM/YYYY HH24:MI:SS')) * 1440.000) from dual
дает результат 94.
Предлагаемое исправление таково - SELECT trunc((TO_DATE ('06/06/2009 16:00:00', 'DD/MM/YYYY HH24:MI:SS') - TO_DATE ('06/06/2009 14:25:00', 'DD/MM/YYYY HH24:MI:SS')) * 1440.000+.00001) from dual
Это решение кажется мне неправильным - может ли кто-нибудь предложить лучший вариант? Фактическое требование состоит в том, чтобы считать целые минуты разницы между двумя датами.
4 ответа
Возможный Дубликат : Oracle дата шаблон для шаблон java дата Формат даты по умолчанию JDBC при чтении даты в виде строки из ResultSet В моем приложении java у меня есть строка даты, поступающая из БД в разных-разных форматах каждый раз 05-Feb-2013 , а также шаблон формата DD-MON-YYYY . Мне нужно.
Как хранятся даты в Oracle? Например, я знаю, что большинство систем используют время эпохи, чтобы определить, какое это время. Подсчитав, сколько секунд осталось до 1 января 1970 года. Делает ли Oracle то же самое? Причина, по которой я спрашиваю об этом, заключается в том, что я заметил, что.
Арифметика даты не совсем точна из-за преобразования типов данных здесь.
Это означает, что ни один из TRUNC, ROUND, CEIL и FLOOR не будет работать во всех случаях.
Чтобы решить эту проблему, вы должны иметь возможность преобразовать каждую дату в целое число, прежде чем выполнять на ней арифметические действия, например:
Забудьте даты и используйте метки времени. Используя арифметику timestamp, Oracle использует тип данных INTERVAL, чтобы избежать проблемы округления.
Если даты разделены более чем на день, вам также нужно будет учесть это.
Почему бы не использовать ROUND вместо TRUNC ? Он дает вам результат до ближайшего дня при применении к датам, ближайшего целого числа при применении к числам ( TRUNC усекается и, похоже, здесь возникают странные арифметические проблемы).
Ну, не то чтобы это должно быть лучше, но вы пробовали FLOOR вместо TRUNC? (В том сумасшедшем случае, если это сработает, вы можете проверить, является ли результат отрицательным, и в этом случае вам нужно будет добавить единицу, потому что FLOOR "rounds" приближается к отрицательной бесконечности, а TRUNC округляется до нуля. Что может быть или не быть для вас более уродливым, чем добавление доли секунды перед использованием TRUNC.)
Похожие вопросы:
Как Oracle DB круглых миллисекунд в его функции даты? Например, если sysdate выполняется точно в 05/25/2012 01:15:25.900, будет ли дата сохранена как 05/25/2012 01:15:26 (округление вверх) или как.
Существует ли функция округления oracle для округления до определенного числа значащих цифр? Например, округление с 1278 до 1300, округление до двух значащих цифр.
Возможный Дубликат : Oracle дата шаблон для шаблон java дата Формат даты по умолчанию JDBC при чтении даты в виде строки из ResultSet В моем приложении java у меня есть строка даты, поступающая из.
Как хранятся даты в Oracle? Например, я знаю, что большинство систем используют время эпохи, чтобы определить, какое это время. Подсчитав, сколько секунд осталось до 1 января 1970 года. Делает ли.
Oracle 11G документация говорит, что формат даты по умолчанию - DD-MON-YYYY, что означает, что если я вставлю дату в столбец даты с помощью: insert into table t values(1, '02-JAN-2013') а затем.
Эта проблема свела меня с ума. Я использую Microsoft SQLExpress 2016 для написания хранимой процедуры. Одним из требований является округление. Но время от времени округление бывает неправильным. Я.
Есть ли какая-либо внутренняя функция в Oracle для поддержки округления банкира, мне нужно использовать округление от Половины до нечетного банкира в запросе select
есть ли какой-нибудь способ вернуть 0 как -0 из oracle sql/plsql , чтобы мы могли сделать некоторую проверку, это просто для того, чтобы убедиться, что значение 0 округлено от отрицательного.
Округление значения запроса до a decimal до 2 в Oracle Сомнение: выберите (1200 + 1245 + 1234) / 12 из dual; Дает результат как 306.583333333333 Ожидаемый результат как 306.58 Пожалуйста, помогите.
До Oracle 9i, только в одном типе данных (DATE) разрешалось хранить point-in-time значения (общий термин, который включает в себя информацию о дате и времени), даже сейчас Oracle не имеет независимых типов данных только для даты или только для времени, как в некоторых других языках. Хотя в Oracle уже добавили другие типы данных связанных со временем, DATE до сих пор считается наиболее удобным и простым в этой группе.
Тип данных DATE может содержать следующую информацию: век, год, месяц, день, час, минута, и секунда. Правильными считаются даты в диапазоне Январь 1, 4712 BC to Декабрь 31, AD 9999. Используйте следующий код для объявления переменных типа данных DATE:
Обявление переменной типа DATE очень простая задача. Вам не надо использовать параметры.
Однако для того чтобы взять часть информации из DATE-переменной вам необходимо будет воспользоваться функцией TO_CHAR с форматом даты показанном в листинге:
/02/12/2006
13:06
12-FEB-06
Применение масок форматов
Для использования даты в строковом формате, необходимо воспользоваться функцией TO_CHAR,например, так:
Функция TO_CHAR конвертирует дату в строку используя специальный формат маски. Таблица. Наиболее часто используемые опции форматирования.
Вы можете использовать некоторые символы в качестве разделителей (например, запятая, точка, пробел, и точка с запятой) с маской формата, но все остальное необходимо заключать в двойные кавычке, например так:
Today is: SUNDAY
Примечание:
5 — Вы можете использовать двоеточие (:) без кавычек, но строка «Сегодня» должна быть в кавычках. Вы можете обернуть процесс, используя функцию TO_DATE для конвертирования строковых значений в значения даты используя надлежащие форматы, например:
Формат DATE позволяет хранить любые временные данные от веков до секунд. Вам необходимо лишь указать желаемые единицы измерения.
Например:
2006-02-01 19:40:00
2006-02-11 00:00:00
Значения по умолчанию:
Oracle использует следующие правила для установки значения по умолчанию:
5 — Пропущенная дата по умолчанию является первым днем текущего месяца.
8 — Пропущенное время приравнивается к полночи текущего дня. Остальные правила:
- Пропущенный год или месяц по умолчанию являются текущими.
- Пропущенный день по умолчанию является первым днем месяца (если иной текущий месяц не указан).
- Пропущенные часы, минуты, секунды по-умолчанию приравниваются к нулевому значению.
Проверка формата данных
Примечания:
6 — Нет двойных кавычек вокруг строки “Today is” в маске формата, но процедура успешно создалась.
15 — Если вы попробуете запустить процедуру P_FORMAT, Oracle выдаст вам ошибку.
Проверяйте правильность при задании формата данных. Значительно проще проверять код на правильность на этапе разработки, нежели искать ошибки во время его работы.
Использование TIMESTAMP
Тип данных DATE имеет ряд ограничений. Поэтому Oracle ввел тип данных TIMESTAMP, который мы и рассмотрим.
Например, с помощью типа данных TIMESTAMP вы можете определить доли секунды (в DATE точность ограничивается секундами).
Повышенная точность определения времени может быть полезна для работы с событиями происходящими в одно и то же время с точностью до секунды.
По умолчанию, Oracle хранит 6 точных цифр, но вы можете указать точность в диапазоне от 0 до 9. TIMESTAMP (0) равен DATE. В примере показано, как объявить TIMESTAMP тип данных:
2 — Для инициализации переменной необходимо использовать SYSTIMESTAMP, а не SYSDATE.
5 — новый элемент маски формата данных FF4 предназначен для задания долей секунд. Если вы укажете точность меньше той что хранится в БД, Oracle использует технику округления результата выдачи идентичную округлению для чисел с плавающей точкой.
Использование TIMESTAMP с параметром TIMEZONE
Еще одно ограничение типа данных DATE заключается в том, что даже если у вас есть значение типа DATE, хранить часовой пояс, в котором
оно была создана невозможно.
Но вы можете хранить часовой пояс для TIMESTAMP данных используя параметр TIMEZONE, как показано в примере:
Oracle может определить time zone используя информацию с сервера БД либо с клиентского компьютера.
Вы можете сами посмотреть эти значения, используя встроенные функции DBTIMEZONE and SESSIONTIMEZONE, как показано в примере:
17:50:42.828000 -05:00-05 00
2-3 — Встроенная функция CURRENT_TIMESTAMP поддерживает тип данных TIMESTAMP в сессионной (клиентской) time zone, но не в time zone базы данных.
6 — Формат TZR возвращает информацию о time zone региона.
В зависисмости от настроек БД, он может из себя представлять или разницу в часах и минутах между сессионной time zone и UTC (всемирное время, ранее время по Гринвичу) или название региона.
8 — Если вы хотите вернуть только разницу во времени в часах и минутах можно воспользоваться параметрами TZH и TZM.
12 — На этой строке мы видим результат работы скипта. Для компьютера, находящегося в Западном Стандартном часовом поясе, разница
во времени составляет 5 часов.
Если ваша система работает в нескольких часовых поясах, информация полученная из CURRENT_TIMESTAMP позволяет точнее определить время активности клиентов вашей БД.
В противном случае (не используя CURRENT_TIMESTAMP), вы не сможете дифференцировать время между 3 ч. дня Восточнго полушария и 3 ч. дня для временного пояса Тихого океана.
Хранение прошедшего времени с помощью типа данных INTERVAL
INTERVAL — еще один полезный тип данных введеный в Oracle 9i для того чтобы расширить функциональность типа данных DATE. Очень часто, вам не нужно хранить точку во времени, но время, прошедшее между точками, то есть интервал. Например, если вы хотите поддерживать услуги телефонной связи, вам необходимп сохранить день, когда был принят вызов и продолжительности звонка, но вам не нужно сохранять информацию о точном времени начала и окончания каждого вызова.
Единственная информация, которую вам нужна в данном случае — сколько времени человек потратил на вызов. Конечно, вы можете использовать две переменные (начало и конец дата/время) и некоторые другие способы, например, хранение часов, минут и секунд в независимых числовых столбцах. Но в как альтернатива, вы можете хранить интервал независимо, который можно будет самостоятельно обрабатывать позднее, как показано здесь:
INTERVAL содержит два типа данных которые позволят вам установить соответствующие более точные значения интервалов:
Тип данных INTERVAL YEAR TO MONTH позволяет хранить и манипулировать интервалами типа годов и месяцев. Вы можете указать количество символов для хранения годов которые вы хотите хранить (по умолчанию 2, доступный диапазон 0–4). Тип данных INTERVAL DAY TO SECOND позволяет хранить и манипулировать интервалами типа дней, часов, минут и секунд. В этом случае, точность для дней позволяет вам ввести число символов для хранения, и точность для секунд определяет число символов для хранения долей секунд.
Работа с датами встроенных функций
Oracle предоставляет ряд встроенных функций для работы с типом данных DATE. Мы обсудим наиболее часто используемые из них ниже.
Функция EXTRACT
Функция EXTRACT позволяет выделить определенную часть даты/интервала/времени (только год, только месяц, и так далее до секунд) как показано на примере:
Функция EXTRACT всегда возвращает численное значение, таким образом если вам необходимо вернуть текстовое наименование месяца то необходимо воспользоваться
функция TO_CHAR. Но если вам необходимо выделить месяц из значения даты, функция EXTRACT быстрее и эффективнее TO_CHAR. Простой пример:
В функцию EXTRACT можно передавать следующие параметры YEAR, MONTH, DAY, HOUR, MINUTE, и SECOND. Так же вы можете использовать типы данных TIME ZONE и TIMESTAMP.
Функции TRUNC and ROUND
Встроенные функции TRUNC и ROUND, обычно применяемые к числовым значениям, так же работают с датами и временем так же как с числами. Функция TRUNC усекает дату до определенного уровня точности, в тоже время ROUND округляет дату до определенной единицы:
Пример использования функций TRUNC и ROUND:
2006-02-12 00:00:00
2006-01-01 00:00:00
2006-02-12 19:00:00
Есть одна важная деталь при сипользовании дат: если точное время не имеет значения и вы хотите использовать запросы с сортировкой по конкртеной дате, всегда усекайте их.
Разумной альтернативой является построение function-based index (see the Oracle manuals) на усекаемое значение TRUNC(value). Это даст вам хороший механизм повышения производительности для поисковых запросов где время не так уж и важно, но вы все еще хотите сэкономить его для других запросов.
Функция ADD_MONTHS
Так как длина месяцев может различаться работать с точностями более чем день не так уж и просто. 29 дней могут быть более некоторого месяца, меньше, или равно. Oracle делает вашу жизнь проще предоставляя встроенные функции для работы с месяцами: ADD_MONTHS, MONTHS_BETWEEN, и LAST_DAY. Функция ADD_MONTHS добавляет целое месяцев к определенной дате.
v_dt:= ADD_MONTHS(date,integer);
6 — Этот код добавляет один месяц к текущему дню.
8 — Этот код добавляет один месяц к Январь 30, 2003.
12 — Результатом этой операции является, дата с текущим временем, но на один месяц в прошлое.
13 —
Вторая операция значительно более интересна так как вы добавляете месяц к дате которая не существует (Ведь не существует 30-го февраля). В этом случае Oracle возвращает полночь следующего дня результирующего месяца. Это поведение самая важная причина использования функции ADD_MONTHS. В противном случае, если вы просто добавите 30 дней, вы можете получить дату в Марте.
Функция LAST_DAY
Функция LAST_DAY возвращает последний день месяца от определенной даты.
v_dt:= LAST_DAY (date);
10 — Помните что каждый раз получая последний день месяца время сохраняется.
Не забудьте усечь дату если вам необходимо получить полночь последнего дня месяца.
Функция MONTHS_BETWEEN
v_nr:= MONTHS_BETWEEN(date1,date2);
Эта функция возвращает число месяцев между двумя датами. Если разница не является точной (целочисленной) вы получите число с
плавающей запятой где десятичная часть представляет остаток от деления N/31 где N число оставшихся дней. Если SYSDATE в районе начала Февраля, вы получите примерно такой результат:
Так как число месяцев представлено числом с плавающей точкой вы всегда можете представить рисунок из дней, часов, минкт, и даже секунд, но технически это делать не рекомендуется. Используйте вместо этого тип данных интервал INTERVAL. Как правило резульатом этой функции является либо целое либо при необходимости усеченное число.
Запись опубликована 13.01.2010 в 5:44 дп и размещена в рубрике Oracle PL/SQL для чайников. Вы можете следить за обсуждением этой записи с помощью ленты RSS 2.0. Можно оставить комментарий или сделать обратную ссылку с вашего сайта.
Oracle реализует набор функций для работы со значениями типа даты/времени. Мы не будем подробно рассматривать все функции, но сводка в табл. 1 познакомит Вас с доступными возможностями. Если какие-то функции вас заинтересуют, обращайтесь за подробным описанием к справочнику Oracle SQL Reference.
Избегайте использования традиционных функций Oracle, обрабатывающих значения типа DATE , при работе с новыми типами данных TIMESTAMP . Вместо них следует по возможности использовать новые функции для типов INTERVAL . А DATE -функции должны использоваться только для обработки значений типа DATE .
Многие из приведенных в табл. 1 функций (в том числе ADD_MONTHS ) получают значения типа DATE . При использовании таких функций с новыми типами данных TIMESTAMP могут возникнуть проблемы. Хотя любой из этих функций можно передать значение типа TIMESTAMP , Oracle неявно преобразует его к типу DATE , и только тогда функция выполнит свою задачу, например:
В этом примере переменная ts содержит значение типа TIMESTAMP WITH TIME ZONE . Это значение неявно преобразуется в DATE при передаче LAST_DAY . Поскольку в типе DATE не сохраняются ни дробные части секунд, ни смещение часового пояса, эти части значения ts попросту отбрасываются. Результат LAST_DAY снова присваивается ts , что приводит к выполнению второго неявного преобразования — на этот раз DATE преобразуется в TIMESTAMP WITH TIME ZONE . Второе преобразование получает часовой пояс сеанса, поэтому в смещении часового пояса в итоговом значении мы видим ?05:00.
Очень важно понимать эти преобразования. и избегать их. Несомненно, вы представляете, какие коварные ошибки могут появиться в программе из-за неосторожного использования функций DATE со значениями TIMESTAMP . Честно говоря, я не представляю, почему в Oracle встроенные функции DATE не были перегружены для нормальной работы с TIMESTAMP . Будьте осторожны!
Читайте также: