oracle последний день года
Oracle LAST_DAY
The Oracle LAST_DAY() takes a DATE argument and returns the last day of the month of that date.
Syntax
The following illustrates the syntax of the Oracle LAST_DAY() function:
Arguments
The LAST_DAY() function accepts one argument:
1) date
The date argument is a DATE value or any expression that evaluates to a DATE value of which you want to get the last day of the month.
Return value
The Oracle LAST_DAY() function always returns a DATE value that represents the last day of the month of that input date.
Examples
Let’s look at the following examples of using the LAST_DAY() function.
A) Get the last day of the current month
The following example returns the last day of the current month:
In this example, the SYSDATE function returns the current system date which is used as an input date for the LAST_DAY() function.
B) Calculate the number of days left of the current month
The following example returns the number of days left in the current month:
C) Return the last day of the last/next month
The following example uses the ADD_MONTHS() function to add and subtract one month and returns the last day of the last and the next month:
Here is the result:
D) Get the last day of February of the leap years
The following example shows how to use the LAST_DAY() function to get the last day of the month February in both leap years and non-leap years:
The following picture illustrates the output of the query:
In this tutorial, you have learned how to use the Oracle LAST_DAY() function to get the last day of the month of a specified date.
Мой блог
среда, 2 июля 2014 г.
Дата и время в Oracle
Форматы даты по умолчанию:
select sysdate from dual;
При вставке в таблицу значений типа date, по умолчанию можно использовать литерал в формате
DD-MON-YYYY
(две цифры номера дня, три буквы месяца и четыре цифры года)
insert into t1 (d) values (’28-APR-1971′);
или использовать ключевое слово DATE для передачи в базу литерала типа data в формате ANSI
YYYY-MM-DD
(четыре цифры года, две цифры месяца, две цифры номера дня)
insert into t1 (d) values ( DATE ‘1971-04-28’);
Конвертация даты в строку:
select to_char(sysdate) from dual;
02 ИЮЛЬ 2014 17:00:51
select to_char(sysdate, ‘CC‘) from dual; — двузначное столетие (век)
Немного о стандарте ISO.
В стандарте ISO, год, относящийся к номеру недели ISO, может отличаться от календарного года.
1 января 1988 года попадает на 53-ю неделю ISO для 1987 года.
Неделя всегда начинается с понедельника и заканчивается воскресеньем.
Как связан год с номером недели по стандарту ISO:
Если 1 января падает на пятницу, субботу или воскресенье, то неделя, включающая 1 января,
считается последней неделей предыдущего года, потому что большинство дней этой недели
принадлежат предыдущему году.
Если 1 января падает на понедельник, вторник, среду или четверг, то эта неделя считается
первой неделей нового года, потому что большинство дней этой недели принадлежат новому году.
1 января 1991 падает на вторник, поэтому неделя с понедельника, 31 декабря 1990 по воскресенье, 6 января 1991 считается неделей 1.
Чтобы получить номер недели ISO, используйте маску формата ‘IW‘ для номера недели и одну из масок вида ‘IY‘ для года.
в данном случае результаты совпадают.
Попробуем с другой датой:
Как видим результаты разные.
При вставке в таблицу даты, рекомендуется указывать все четыре цифры года.
Если указать только две последние цифры года, то две первые цифры (столетие)
Oracle будет интерпретировать в зависимости от того, какой формат был использован при вводе.
Если использовать формат YY, то в качестве столетия будет использовано текущее столетие,
которое в настоящее время установлено на сервере.
select
to_char(to_date(’28-04-14′, ‘DD-MM-YY‘), ‘DD-MM-YYYY’),
to_char(to_date(’28-04-77′, ‘DD-MM-YY‘), ‘DD-MM-YYYY’)
from dual;
Неважно какой год мы указали, столетие всегда будет текущее (т.е. 20)
Если использовать формат YYYY но при этом указать только две последние цифры года
то в качестве столетия Oracle подставит нули (т.е. 00)
select
to_char(to_date(’28-04-14′, ‘DD-MM-YYYY‘), ‘DD-MM-YYYY’),
to_char(to_date(’28-04-77′, ‘DD-MM-YYYY‘), ‘DD-MM-YYYY’)
from dual;
Если использовать формат RR и указать только две последние цифры года, то две первые цифры (столетие)
Oracle будет вычислять по следующим правилам:
Если указанный год находится в интервале от 00 до 49 и текущий год тоже попадает в этот интервал,
то столетие будет текущим, но если при этом текуший год будет находится в интервале от 50 до 99,
то столетие при этом будет увеличено на 1 (текущее столетие + 1).
select
to_char(to_date(’28-04-14′, ‘DD-MM-RR’), ‘DD-MM-YYYY’),
to_char(to_date(’28-04-77′, ‘DD-MM-RR‘), ‘DD-MM-YYYY’)
from dual;
Вобщем запомнить легко, если указанный год, больше текущего диапазона, значит столетие уменьшаем
и наоборот если указанный год, меньше текущего диапазона, значит столетие увеличиваем.
Интересно, а что будет если использовать формат RRRR, но при этом указать только две последние цифры года:
select
to_char(to_date(’28-04-14′, ‘DD-MM-RRRR‘), ‘DD-MM-YYYY’),
to_char(to_date(’28-04-77′, ‘DD-MM-RRRR‘), ‘DD-MM-YYYY’)
from dual;
В качестве столетия Oracle не подставил нули, вывод аналогичен формату RR.
Для выделения первой цифры столетия в формате года можно использовать запятую:
Допустимые форматы года:
2014 2014 2014 2014 2 014 014 014 14 14 14 4 4
А также год прописью:
Существует тип TIMESTAMP, который может хранить дробную часть секунд.
Необязательную точность представления секунд можно определить параметром FF[1..9]
Значение этого параметра по умолчанию равно 6 (справа от десятичной точки секунд можно поместить до 6 цифр)
При попытке поместить большее количество цифр в дробную часть секунд, значение дробной части будет округлено.
В отчетах statspack применяются следующие обозначения долей секунд:
SELECT TO_CHAR(SYSDATE, ‘YYYY—MM—DD HH24:MI.SS’) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘YYYY/MM/DD;HH24 «часов» MI «минут» SS «секунд»‘) FROM dual;
12-часовой формат исчисления времени предполагает разбиение 24 часов, составляющих сутки,
на два 12-часовых интервала, обозначаемых a.m. (лат. ante meridiem дословно — «до полудня»)
и p.m. (лат. post meridiem дословно — «после полудня»).
00:00 (полночь) 12:00 a.m.* (полночь)
12:00 (полдень) 12:00 p.m.* (полдень)
Проблемы в обозначениях полудня и полуночи:
Несмотря на наличие международного стандарта ISO 8601, 12 часов ночи и 12 часов дня обозначается в разных
странах по-разному. Это связано с тем, что в латинских словосочетаниях лат. ante meridiem и
лат. post meridiem слово meridiem означает буквально «середина дня» или «полдень»,
и нет однозначности между обозначением полудня как «12 a.m.» («12 ante meridiem»,
или «12 часов до середины дня») или как «12 p.m.» («12 post meridiem», или «12 часов после середины дня»).
С другой стороны, полночь также можно логично назвать «12 p.m.» (12 post meridiem,
12 часов после предыдущей середины дня) или «12 a.m.» (12 ante meridiem, 12 часов до следующей середины дня).
National Maritime Museum в Гринвиче рекомендует обозначать эти временные моменты как «12 дня» и «12 ночи».
То же советует и The American Heritage Dictionary of the English Language. Многие руководства по стилю,
принятые в США, предлагают «полночь» заменять на «11:59 p.m.», если мы хотим обозначить конец дня,
и «12:01 a.m.», если мы хотим обозначить начало следующего дня.
SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI.SS AM‘) FROM dual;
2014-10-18 14:53.58 PM
SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI.SS BC‘) FROM dual;
2014-10-18 15:00.25 Н.З.
SELECT TO_CHAR(SYSDATE, ‘DDTH‘) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘ddTH‘) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘mmTH‘) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘YYYYTH‘) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘yyyyTH-MMTH-DDTH HH24TH:miTH.SSTH BC’) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘DDSP‘) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘ddSP‘) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘mmTHSP‘) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘mmSP‘) FROM dual;
SELECT TO_CHAR(SYSDATE, ‘YYYYTHSP‘) FROM dual;
TWO THOUSAND FOURTEENTH
SELECT TO_CHAR(SYSDATE, ‘YYYYSP‘) FROM dual;
TWO THOUSAND FOURTEEN
Получить названия часовых поясов можно так:
select * from v$timezone_names;
Africa/Abidjan LMT
Africa/Abidjan GMT
Africa/Accra LMT
Africa/Accra GMT
Africa/Accra GHST
Africa/Addis_Ababa LMT
Africa/Addis_Ababa ADMT
Africa/Addis_Ababa EAT
Africa/Algiers LMT
Africa/Algiers PMT
Africa/Algiers WET
.
Посмотрим какое смещение относительно UTC установлено в нашей БД:
select dbtimezone from dual;
(меняется параметром time_zone в spfile.ora)
Часовой пояс сеанса можно определить так:
select sessiontimezone from dual;
Europe/Moscow
Его легко можно поменять на время сеанса:
alter session set time_zone = ‘PST’;
select sessiontimezone from dual;
Стандартное Тихоокеанское время PST отстает от UTC на восемь часов.
Восточное стандартное время EST отстает от UTC на пять часов.
Текущую дату для сеанса в локальном часовом поясе можно определить так:
select current_date from dual;
select to_char(current_date, ‘YYYY-MM-DD HH24:MI.SS’ ) from dual;
Для любого часового пояса можно найти величину смещения с помощью функции tz_offset().
select tz_offset(‘PST’) from dual;
select tz_offset(‘Europe/Moscow’) from dual;
Tип TIMESTAMP, в отличие от типа DATE, может хранить информацию о часовых поясах.
select to_char(SYSTIMESTAMP, ‘TZH:TZM‘) from dual;
select to_char(SYSTIMESTAMP, ‘TZR‘) from dual;
select to_char(SYSTIMESTAMP, ‘TZD‘) from dual;
select to_char(SYSTIMESTAMP, ‘HH:MI:SS.FFTZH:TZM‘) from dual;
select to_char(SYSTIMESTAMP, ‘YYYY-MM-DD HH:MI:SS TZH:TZM‘) from dual;
2014-10-18 10:52:19 +04:00
select to_char(SYSTIMESTAMP, ‘YYYY-MM-DD HH:MI:SS.FF AM TZH:TZM TZR TZD‘) from dual;
2014-10-18 10:52:31.802000 PM +04:00 +04:00
Чтобы конвертировать дату-время из одного часового пояса к другому,
можно воспользоваться функцией NEW_TIME().
Конвертация строки в тип дата-время.
Функцию TO_DATE(x [, формат])
можно использовать для конвертирования строки x в тип дата-время.
Если строка формата опущена, то дата должна быть представлена в формате по умолчанию:
DD-MON-YYYY или DD-MON-YY
(Вообще формат даты по умолчанию определяет параметр БД NLS_DATE_FORMAT)
alter session set NLS_DATE_LANGUAGE = ‘AMERICAN’ ;
alter session set NLS_DATE_FORMAT = ‘SYYYY-MM-DD’ ;
alter session set NLS_TIMESTAMP_FORMAT = ‘SYYYY-MM-DD HH24:MI:SS’ ;
alter session set NLS_TIMESTAMP_TZ_FORMAT = ‘SYYYY-MM-DD HH24:MI:SS TZH:TZM’ ;
alter session set NLS_DATE_LANGUAGE = ‘AMERICAN’;
alter session set NLS_DATE_FORMAT = ‘DD-MON-RRRR’;
select to_date(’28-APR-1971′), to_date(’28-APR-71′) from dual;
Можно и явно задать формат
Совместное использование to_date() и to_char()
Формат даты по умолчанию, можно использовать и при вставке строк в таблицу:
alter session set NLS_DATE_FORMAT = ‘DD-MON-YYYY‘;
insert into t1 ( id, bday ) values (1, ‘28-APR-1971‘ );
National language_support (До Oracle9i)
Globalisation support (Начиная с Oracle9i)
Кодировка устанавливается только в переменных окружения!
1) Язык вывода сообщений об ошибках
2) на каком языке выводить названия месяцев и дней недели
(Если явно не задан параметр NLS_DATE_LANGUAGE)
SELECT * FROM v$nls_valid_values
WHERE parameter = ‘LANGUAGE’
ORDER BY value
SELECT * FROM v$nls_valid_values
WHERE parameter = ‘TERRITORY’
ORDER BY value
SELECT * FROM v$nls_valid_values
WHERE parameter = ‘CHARACTERSET’
— Русский язык, Кириллица
AND (value LIKE ‘CL%’
OR
value LIKE ‘RU%’)
ORDER BY value
NLS_LANG = AMERICAN_CIS.CL8MSWIN1251
NLS_LANG = AMERICAN_AMERICA.RU8PC866
NLS_LANG = RUSSIAN_CIS.CL8ISO8859P1
Какие есть параметры NLS?
SELECT * FROM nls_session_parameters
Как можно устанавливать значения параметров NLS?
1. В системном реестре Windows
2. Установить переменные окружения
Для Windows (в bat-файле)
3. ALTER SESSION SET
NLS_DATE_LANGUAGE=RUSSIAN
NLS_DATE_FORMAT=’DD.MM.YYYY’;
SELECT TO_CHAR(SYSDATE, ‘Month day’)
FROM dual
Посмотреть nls-параметры сессии, базы данных и инстанса можно так:
select * from
(select ‘SESSION’ SCOPE,s.* from nls_session_parameters s
union
select ‘DATABASE’ SCOPE,d.* from nls_database_parameters d
union
select ‘INSTANCE’ SCOPE,i.* from nls_instance_parameters i
) a
pivot (LISTAGG(VALUE) WITHIN GROUP (ORDER BY SCOPE)
FOR SCOPE
in (‘SESSION’ as «SESSION»,’DATABASE’ as «DATABASE»,’INSTANCE’ as «INSTANCE»));
Функции для работы с типом data.
ADD_MONTHS(data, n)
Позволяет добавить к дате целое количество месяцев (или отнять, если n отрицательное)
В функцию ADD_MONTHS() можно передать и дату и время:
SELECT
TO_CHAR(ADD_MONTHS(TO_DATE(‘31.10.2001 21:08:50‘, ‘fxDD.MM.YYYY HH24:MI:SS’)
, 4) — Добавить 4 месяца
, ‘DD.MM.YYYY HH24:MI:SS’)
FROM DUAL;
SELECT
TO_CHAR(ADD_MONTHS(TO_DATE(‘28.02.2001 21:08:50‘, ‘fxDD.MM.YYYY HH24:MI:SS’)
, -4) — Отнять 4 месяца
, ‘DD.MM.YYYY HH24:MI:SS’)
FROM DUAL;
Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
Базы данных
TO_DATE ФУНКЦИЯ
В этом учебном пособии вы узнаете, как использовать Oracle/PLSQL функцию TO_DATE с синтаксисом и примерами.
Описание
Oracle/PLSQL функция TO_DATE преобразует строку в дату.
Синтаксис
Синтаксис функции Oracle/PLSQL TO_DATE:
Параметры или аргументы
string1 это строка, которая будет преобразована в дату.
format_mask не является обязательным. Это формат, который будет использоваться для преобразования string1 к дате.
Это может быть одно или сочетание следующих значений:
Параметр | Пояснение |
---|---|
YYYY | 4-х значный год |
YYY YY Y | Последние 3, 2 или 1 цифры(а) года. |
IYY IY I | Последние 3, 2 или 1 цифры(а) года ISO. |
IYYY | 4-значный год в соответствии со стандартом ISO |
RRRR | Принимает год с 2 цифрами и возвращает год с 4 цифрами. Значение между 0-49 вернет 20xx год. Значение между 50-99 вернет 19xx год. |
Q | Квартал года (1, 2, 3, 4; JAN-MAR = 1). |
MM | Месяц (01-12; JAN = 01). |
MON | Сокращенное название месяца. |
MONTH | Название месяца, дополненное пробелами длиной до 9 символов. |
RM | Римская цифра RM (I-XII; JAN = I). |
WW | Неделя года (1-53), где неделя 1 начинается в первый день года и продолжается до седьмого дня года. |
W | Неделя месяца (1-5), где 1-я неделя начинается в первый день месяца и заканчивается седьмым. |
IW | Неделя года (1-52 или 1-53) на основе стандарта ISO. |
D | День недели (1-7). |
DAY | Название дня. |
DD | День месяца (1-31). |
DDD | День года (1-366). |
DY | Сокращенное название дня. |
J | Юлианский день; количество дней с 1 января 4712 г. до н.э. |
HH | Час дня (1-12). |
HH12 | Час дня (1-12). |
HH24 | Час дня (0-23). |
MI | Минута (0-59). |
SS | Секунда (0-59). |
SSSSS | Секунды после полуночи (0-86399). |
FF | Дробные секунды. Используйте значение от 1 до 9 после FF, чтобы указать количество цифр в долях секунды. Например, ‘FF4’. |
AM, A.M., PM, или P.M. | Индикатор меридиана. |
AD или A.D | AD индикатор. |
BC или B.C. | BC индикатор. |
TZD | Летнее время информация. Например, ‘PST’ |
TZH | Часовой пояс час. |
TZM | Часовой пояс минуты. |
TZR | Часовой пояс региона. |
nls_language не является обязательным. NLS language используется для преобразования string1 к дате.
Применение
Функцию TO_DATE можно использовать в следующих версиях Oracle/PLSQL:
Пример
Рассмотрим несколько примеров функции TO_DATE, чтобы понять, как использовать функцию TO_DATE в Oracle/PLSQL.
Использование Функций с Датами
В примере на рисунке функция ADD_MONTHS добавляет один месяц к предоставленному значению даты “31-JAN-96” и возвращает «29-FEB-96».
Функция распознает 1996 год как високосный год и, поэтому, возвращается последний день февраля. Если Вы изменяете входное значение даты на «31-JAN-95», функция возвращает «28-FEB-95».
Например, выведите на экран номер сотрудника, дату приема, число месяцев занятости, дату приема плюс 6 месяцев, первую пятницу после даты приема и последний день месяца приема для всех сотрудников, которые были приняты на работу менее 150 месяцев назад.
SELECT employee_id, hire_date, MONTHS_BETWEEN (SYSDATE, hire_date) TENURE, ADD_MONTHS (hire_date, 6) REVIEW, NEXT_DAY (hire_date, ‘FRIDAY’), LAST_DAY(hire_date)
FROM employees WHERE MONTHS_BETWEEN (SYSDATE, hire_date)
Использование Функций ROUND и TRUNC с Датами
Предположим, что SYSDATE = ’25-JUL-03′ :
Функции ROUND и TRUNC могут использоваться для числовых значений и дат. Когда они используются с датами, эти функции округляют или усекают дату к указанной модели формата. Поэтому, Вы можете округлять даты к самому близкому году или месяцу. Если модель формата является месяцем, даты 1-15 результируются к первому дню текущего месяца. Даты 16-31 результируются к первому дню следующего месяца. Если модель формата является годом, месяцы 1-6 дают в результате 1 января текущего года. Месяцы 7-12 результируются к 1 января следующего года.
Пример:
Сравнение дат приема всех сотрудников, которые начали работать в 1997. Вывод на экран номера сотрудника, даты приема и начала месяца, используя функции TRUNC и ROUND.
Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
Базы данных
ROUND ФУНКЦИЯ (ДЛЯ ДАТ)
В этом учебном пособии вы узнаете, как использовать Oracle/PLSQL функцию ROUND (для дат) с синтаксисом и примерами.
Описание
Oracle/PLSQL функция ROUND возвращает дату округленную до определенной единицы измерения.
Синтаксис
Синтаксис Oracle/PLSQL функции ROUND (для дат):
Параметры или аргументы
date дата для округления.
format единица измерения применяемая для округления. Если параметр format опущен, функция ROUND округляет до ближайшего дня.
Ниже приведены допустимые параметры format :
Unit | Допустимый формат параметров | Правило округления |
---|---|---|
Year | SYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y | Округляет до 1 июля |
ISO Year | IYYY, IY, I | |
Quarter | Q | Округляет до 16 числа второго месяца квартала |
Month | MONTH, MON, MM, RM | Округляет до 16 числа месяца |
Week | WW | Тот же день недели, что и первый день года |
IW | IW | Тот же день недели, что и первый день года ISO |
W | W | Тот же день недели, что и первый день месяца |
Day | DDD, DD, J | |
Начальный день недели | DAY, DY, D | |
Hour | HH, HH12, HH24 | |
Minute | MI |
Функция ROUND (применительно к датам) возвращает значение date.
Применение
Функцию ROUND можно использовать в следующих версиях Oracle/PLSQL:
Пример
Рассмотрим несколько примеров функции ROUND и изучим, как использовать функцию ROUND в Oracle/PLSQL.