Oracle: как добавить минуты в метку времени?
Мне нужно добавить 30 минут к значениям в столбце даты Oracle. Я делаю это в инструкции SELECT, указывая
to_char(date_and_time + (.000694 * 31)
который отлично работает в большинстве случаев. Но не тогда, когда время на границе AM/PM. Например, добавление 30 минут к 12:30
[, которое является PM] возвращает 1:00
, который является AM. Ответ, который я ожидаю, составляет 13:00
. Каков правильный способ сделать это?
Ответы
Ответ 1
Все остальные ответы в основном правы, но я не думаю, что кто-то прямо ответил на ваш оригинальный вопрос.
Предполагая, что "date_and_time" в вашем примере представляет собой столбец с типом DATE или TIMESTAMP, я думаю, вам просто нужно изменить это:
to_char(date_and_time + (.000694 * 31))
:
to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')
Похоже, что в вашем формате даты по умолчанию используется код "HH" для часа, а не "HH24".
Кроме того, я думаю, что ваш постоянный термин является как запутанным, так и неточным. Я предполагаю, что вы сделали, вычисляя, что (.000694) составляет около минуты, и вы умножаете его на количество минут, которые вы хотите добавить (31 в примере, хотя вы сказали 30 в тексте).
Я бы также начал с дня и разделил его на единицы, которые вы хотите в своем коде. В этом случае (1/48) будет составлять 30 минут; или если вы хотите разбить его для ясности, вы можете написать ((1/24) * (1/2)).
Это позволит избежать ошибок округления (за исключением тех, которые присущи плавающей запятой, которые здесь должны быть бессмысленными) и яснее, по крайней мере для меня.
Ответ 2
В дополнение к тому, что вы можете добавить несколько дней к дате, вы можете использовать типы интервальных данных, если вы находитесь на 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
Ответ 3
из http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value
Псевдо-столбец SYSDATE показывает текущую системную дату и время. Добавление 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
Ответ 4
UPDATE "TABLE"
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute
WHERE (...)
Где interval
является одним из
- год
- МЕСЯЦ
- ДЕНЬ
- ЧАС
- МИНУТА
- ВТОРОЕ
Ответ 5
Если типом данных поля является дата или временная метка, Oracle всегда должен давать правильный результат, если вы добавите правильный номер, указанный в количестве дней (или правильную долю дня в вашем случае). Поэтому, если вы пытаетесь увеличить значение за 30 минут, вы должны использовать:
select field + 0.5/24 from table;
Основываясь на предоставленной вами информации, я считаю, что это то, что вы пытались сделать, и я уверен, что он работает.
Ответ 6
Я предпочитаю использовать литерал interval
для этого, потому что interval '30' minute
или interval '5' second
намного легче читать, затем 30 / (24 * 60)
или 5 / (24 * 60 * 69)
например.
-
some_date + interval '2' hour
-
some_date + interval '30' minute
-
some_date + interval '5' second
-
some_date + interval '2' day
Вы также можете объединить несколько единиц в одно выражение:
-
some_date + interval '2 3:06' day to minute
Добавляет 2 дня, 3 часа и 6 минут к значению даты
Вышеупомянутый стандарт также является стандартным SQL, а также работает в нескольких других СУБД.
Подробнее в руководстве: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00221
Ответ 7
Нельзя ли использовать этот
SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;
Я новичок в этом домене.
Ответ 8
Убедитесь, что 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'
Ответ 9
В зависимости от того, что вы просите, вы хотите формат HH24: MI для to_char.
Ответ 10
Чтобы изменить дату в оракуле, вы можете попробовать
select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>
Ответ 11
SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual;
просто вы можете использовать это с различным форматом даты....