oracle добавить день к дате
Функция DATEADD стр. 2
На примере задачи 7.1.1 рассмотрим добавление интервала к дате для других СУБД.
MySQL
MySQL имеет похожую функцию с непохожими аргументами. Вот синтаксис этой функции:
Допустимы следующие типы интервалов, имена которых говорят сами за себя:
|
Решение нашей задачи для MySQL примет вид:
|
Чтобы добавить интервал, представляющий собой несколько компонентов времени, используется подстрока из стандартного представления даты/времени. Так, например, чтобы добавить к ‘2018-01-27T13:00:00’ один день и 3 часа, можно написать:
Добавление 1 дня и 15 секунд будет выглядеть так:
PostgreSQL и Oracle
Эти СУБД не используют функцию. Для добавления интервала применяется обычный оператор сложения «+»:
Обратите внимание, что величина интервала должна иметь символьный тип данных.
Добавить 1 день и 3 часа
У PostgreSQL нет составных интервалов, поэтому можно либо выразить величину интервала в терминах меньшего интервала
Аналогично можно поступить для добавления одного дня и 15 секунд, например:
Oracle позволяет использовать составные интервалы, например, 1 день и 3 часа:
Разумеется, можно также прибавить два простых интервала, как и в случае PostgreSQL.
Add days Oracle SQL
Oracle Express says ADD_DAYS invalid? Any ideas what Am I doing wrong?
6 Answers 6
You can use the plus operator to add days to a date.
In a more general way you can use «INTERVAL». Here some examples:
2) add some minutes
Some disadvantage of «INTERVAL ‘1’ DAY» is that bind variables cannot be used for the number of days added. Instead, numtodsinterval can be used, like in this small example:
It’s Simple.You can use
This will add two days from current date.
One thing about select (sysdate+3) from dual is that the sysdate is interpreted as date.
But if you want to use a custom date, not local, you need to make sure it is interpreted as date, not string. Like so (adding 3 days):
Not the answer you’re looking for? Browse other questions tagged sql oracle11g or ask your own question.
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.11.4.40650
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Мой блог
среда, 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;
DATEADD (Transact-SQL)
Эта функция добавляет указанное значение number (целое число со знаком) к заданному аргументу datepart входного значения date, а затем возвращает это измененное значение.
Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).
Синтаксические обозначения в Transact-SQL
Синтаксис
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
datepart
Компонент даты date, к которому DATEADD добавляет целое число. В приведенной ниже таблице перечислены все допустимые аргументы datepart.
DATEADD не принимает эквивалентные переменные, определяемые пользователем, для аргументов datepart.
datepart | Сокращения |
---|---|
year | yy, yyyy |
quarter | qq, q |
month | mm, m |
dayofyear | dy, y |
day | dd, d |
week | wk, ww |
weekday | dw, w |
hour | hh |
minute | mi, n |
second | ss, s |
millisecond | ms |
microsecond | mcs |
nanosecond | ns |
number
Выражение, которое разрешается в тип int, добавляемый DATEADD к компоненту datepart даты date. DATEADD принимает определяемые пользователем значения переменных для number. DATEADD усечет указанное значение number, имеющее десятичную дробь. В этой ситуации значение number не округляется.
date
Выражение, которое может быть разрешено в одно из следующих значений.
Для date DATEADD будет принимать столбец выражения, выражение, строковый литерал или определяемую пользователем переменную. Значение строкового литерала должно разрешаться в datetime. Во избежание неоднозначности используйте четырехзначную запись года. Сведения о двузначном обозначении года см. в статье Настройка параметра конфигурации сервера two digit year cutoff.
Типы возвращаемых данных
Возвращаемое значение
Аргумент datepart
Функции dayofyear, day и weekday возвращают одинаковое значение.
Каждое выражение datepart и его краткие формы возвращают одно и то же значение.
Если верны следующие условия:
то DATEADD возвращает последний день возвращаемого месяца. Например, в сентябре 30 (тридцать) дней, поэтому эти инструкции возвращают 2006-09-30 00:00:00.000:
Аргумент number
Аргумент number не может выходить за диапазон типа данных int. В приведенных ниже инструкциях аргумент number превышает диапазон типа данных int на 1. Обе эти инструкции возвращают сообщение об ошибке: » Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int.»
Аргумент date
DATEADD не будет принимать аргумент date, увеличенный до значения, выходящего за диапазон соответствующего типа данных. В приведенных ниже инструкциях значение number, добавленное к значению date, превышает диапазон типа данных date. DATEADD возвращает следующее сообщение об ошибке: » Msg 517, Level 16, State 1, Line 1 Adding a value to a ‘datetime’ column caused overflow «.
Возвращаемые значения дат с типом данных smalldatetime и частью даты в виде секунд или долей секунды.
Значение секунд даты типа smalldatetime всегда равно 00. Для значения date типа smalldatetime действуют указанные ниже условия.
Remarks
Используйте DATEADD в следующих предложениях.
Точность в долях секунды
DATEADD не допускает использование при сложении в качестве аргумента datepart значений microsecond или nanosecond для типов данных date: smalldatetime, date и datetime.
Миллисекунды имеют точность 3 знака (0,123), микросекунды — 6 знаков (0,123456), наносекунды — 9 знаков (0,123456789). Типы данных time, datetime2 и datetimeoffset имеют максимальную точность 7 знаков (0,1234567). Если аргументом datepart является nanosecond, аргумент number должен иметь значение 100 перед увеличением даты date на доли секунды. number от 1 до 49 округляется до 0, а number от 50 до 99 округляется до 100.
Эти инструкции добавляют часть даты datepart: millisecond, microsecond или nanosecond.
Смещение часового пояса
DATEADD не допускает добавление для смещения часового пояса.
Примеры
A. Увеличение части даты на интервал, равный 1
Каждая из этих инструкций увеличивает часть даты datepart на интервал, равный 1.
Б. Увеличение нескольких уровней части даты в одной инструкции
Каждая из этих инструкций увеличивает часть даты datepart на число number, достаточно большое, чтобы также увеличить следующую часть datepart даты date.
В. Использование выражений в качестве аргументов number и date
В этих примерах выражения различного типа используются в качестве аргументов для параметров number и date. В примерах используется база данных AdventureWorks.
Указание столбца в качестве аргумента date
Частичный результирующий набор имеет следующий вид:
Указание пользовательских переменных в качестве аргументов number и date
В этом примере в качестве аргументов number и date указываются пользовательские переменные.
Указание в качестве аргумента date скалярной системной функции
Указание в качестве аргументов number и date скалярных вложенных запросов и скалярных функций
Указание в качестве аргументов number и date числовых выражений и скалярных системных функций
Указание в качестве аргумента number ранжирующих функций
В этом примере в качестве аргумента number используется ранжирующая функция.
Указание в качестве аргумента number статистической оконной функции
В этом примере в качестве аргумента number используется агрегатная оконная функция.
Oracle: как добавить минуты к метке времени?
мне нужно добавить 30 минут к значениям в столбце даты Oracle. Я делаю это в своем операторе SELECT, указав
to_char(date_and_time + (.000694 * 31)
11 ответов
все остальные ответы в основном правы, но я не думаю, что кто-то прямо ответил на ваш первоначальный вопрос.
предполагая, что «date_and_time» в вашем примере является столбцом с типом DATE или TIMESTAMP, я думаю, вам просто нужно изменить это:
похоже, что ваш формат даты по умолчанию использует код » HH «для часа, а не»HH24».
Я бы также начал с дня и разделил его на единицы, которые вы хотите в своем коде. В этом случае (1/48) будет 30 минут; или если вы хотите разбить его для ясности, вы можете написать ( (1/24) * (1/2) ).
Это позволит избежать ошибок округления (за исключением присуще плавающей точке, которая здесь должна быть бессмысленной) и понятнее, по крайней мере для меня.
в дополнение к возможности добавить несколько дней к дате, вы можете использовать интервальные типы данных, предполагая, что вы находитесь на Oracle 9i или позже, что может быть несколько проще для чтения,
псевдо-столбец SYSDATE показывает текущую системную дату и время. Добавление 1 в SYSDATE продвинет дату на 1 день. Используйте дроби, чтобы добавить часы, минуты или секунды к дате
здесь interval один из
Я предпочитаю использовать interval литерал для этого, потому что interval ’30’ minute или interval ‘5’ second намного легче читать, чем 30 / (24 * 60) или 5 / (24 * 60 * 69)
вы также можете объединить несколько единиц в одно выражение:
добавляет 2 дня, 3 часа и 6 минут к дате значение
выше также стандартный SQL, а также работает в нескольких других СУБД.
Если тип данных поля-дата или метка времени, Oracle всегда должна давать правильный результат, если вы добавляете правильное число, заданное в количестве дней (или правильную долю дня в вашем случае). Поэтому, если вы пытаетесь увеличить значение за 30 минут, вы должны использовать:
основываясь на информации, которую вы предоставили, я считаю, что это то, что вы пытались сделать, и я уверен, что это работает.
мы не можем использовать этот
Я новичок в этой области.
убедитесь, что Oracle понимает, что время начала-PM,и укажите маску формата HH24 для конечного вывода.
основываясь на том, что вы просите, вы хотите формат HH24:MI для to_char.
для редактирования даты в oracle вы можете попробовать
просто вы можете использовать это с различным форматом даты.