Мне нужно добавить 30 минут к значениям в столбце даты Oracle. Я делаю это в операторе SELECT, указывая
to_char(date_and_time + (.000694 * 31)
что в большинстве случаев работает нормально. Но не тогда, когда время находится на границе AM/PM. Например, прибавление 30 минут к 12:30
[что является PM] возвращает 1:00
, что является AM. Я же ожидаю ответ 13:00
. Как правильно поступить в этом случае?
Кроме того, что к дате можно добавить несколько дней, можно использовать интервальные типы данных, если вы работаете на Oracle 9i
или более поздней версии, которые могут быть несколько проще для чтения,
SQL> ed
Wrote file afiedt.buf
SELECT sysdate, sysdate + interval '30' minute FROM dual
SQL> /
SYSDATE SYSDATE+INTERVAL'30'
-------------------- --------------------
02-NOV-2008 16:21:40 02-NOV-2008 16:51:40
Все остальные ответы в принципе правильно, но я не'т думаю, что кто'ы прямо ответил на ваш исходный вопрос.
Если предположить, что "date_and_time код" в вашем примере это столбец с типом "дата" или timestamp, я думаю, вы просто должны изменить это:
to_char(date_and_time + (.000694 * 31))
к этому:
to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')
Похоже, что ваш формат даты используется в " умолчанию;чч-то" Код за час, а не на "HH24-то".
Кроме того, я думаю, что ваш постоянный термин является запутанным и неточным. Я думаю, что вы сделали-это посчитать, что (.000694) о стоимости минуты, и вы не умножив его на количество минут, которые вы хотите добавить (31 в Примере, хотя вы сказали 30 в тексте).
Я также хотел бы начать с день и разделить его на блоки, которые вы хотите в вашем коде. В этом случае (1/48) будет 30 минут; или если вы хотели, чтобы разбить его для ясности, вы могли бы написать ( (1/24) * (1/2) ).
Это позволит избежать ошибок округления (за исключением тех, которые присущи плавающей точкой, которые должны быть бессмысленны здесь) и понятнее, по крайней мере для меня.
от http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value
У любого псевдо-колонка показывает текущую системную дату и время. Добавление 1 к значению sysdate будет увеличивать дату на 1 день. Использовать дроби, чтобы добавить часы, минуты или секунды в дату
SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual;
SYSDATE SYSDATE+1/24 SYSDATE+1/1440 SYSDATE+1/86400
-------------------- -------------------- -------------------- --------------------
03-Jul-2002 08:32:12 03-Jul-2002 09:32:12 03-Jul-2002 08:33:12 03-Jul-2002 08:32:13
Я предпочитаю использовать интервал
литерал для этого, потому что интервал '30' минуту " или " интервал '5' Вторая-это гораздо легче читать тогда 30 / (24 60)или
5 / (24 60 * 69)`
например
some_date + интервал '5' Вторая
Вы также можете объединить несколько подразделений в одно выражение:
Добавляет 2 дней, 3 часов и 6 минут до даты валютирования
Выше тоже стандартный SQL, а также работает в ряде других СУБД.
Более подробно в руководстве: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00221
Если тип данных поля - дата или временная метка, то Oracle всегда должен выдавать правильный результат, если вы добавите правильное число, заданное в количестве дней (или правильную долю дня в вашем случае). Так, если вы пытаетесь отбить значение за 30 минут, то следует использовать:
select field + 0.5/24 from table;
Основываясь на предоставленной вами информации, я полагаю, что именно это вы и пытались сделать, и я уверен, что это работает.
Мы не можем использовать этот
SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;
Я новичок в этой области.
Убедитесь, что Oracle понимает, что начальное время - PM, и укажите маску формата HH24 для конечного вывода.
SELECT to_char((to_date('12:40 PM', 'HH:MI AM') + (1/24/60) * 30), 'HH24:MI') as time
FROM dual
TIME
---------
13:10
Примечание: 'AM'
в HH:MI - это просто заполнитель для индикатора меридиана AM/PM. Может быть также 'PM'
.
Основываясь на том, что вы'вновь просит, Вы хотите, чтобы HH24:Mi для to_char формат.
как то очень легко
я добавил 10 минут к системной даты и всегда в предпочтении использовать функции сервера БД не пользовательский .
select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;
SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual;
просто вы можете использовать это с различными формат даты....