Oracle: как добавить минуты к метке времени?

мне нужно добавить 30 минут к значениям в столбце даты Oracle. Я делаю это в своем операторе SELECT, указав

to_char(date_and_time + (.000694 * 31)

, который работает большую часть времени. Но не тогда, когда время находится на границе AM/PM. Например, добавление 30 минут к 12:30 [который является PM] возвращает 1:00 что есть AM. Ответ, который я ожидаю,13:00. Как правильно это сделать?

11 ответов


все остальные ответы в основном правы, но я не думаю, что кто-то прямо ответил на ваш первоначальный вопрос.

предполагая, что "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) ).

Это позволит избежать ошибок округления (за исключением присуще плавающей точке, которая здесь должна быть бессмысленной) и понятнее, по крайней мере для меня.


в дополнение к возможности добавить несколько дней к дате, вы можете использовать интервальные типы данных, предполагая, что вы находитесь на 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

от 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

UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

здесь interval один из

  • год
  • месяц
  • день
  • час
  • минуту
  • второй

Я предпочитаю использовать 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


Если тип данных поля-дата или метка времени, 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 meridian. Может быть также 'PM'


основываясь на том, что вы просите, вы хотите формат HH24:MI для to_char.


для редактирования даты в oracle вы можете попробовать

  select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
           'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>

SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual;

просто вы можете использовать это с различным форматом даты....