Oracle: как добавить минуты к отметке времени? - PullRequest
34 голосов
/ 02 ноября 2008

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

to_char(date_and_time + (.000694 * 31)

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

Ответы [ 12 ]

113 голосов
/ 03 ноября 2008

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

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

Предполагая, что "date_and_time" в вашем примере является столбцом с типом DATE или TIMESTAMP, я думаю, вам просто нужно изменить это:

to_char(date_and_time + (.000694 * 31))

к этому:

to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')

Похоже, формат даты по умолчанию использует код "ЧЧ" для часа, а не "ЧЧ24".

Кроме того, я думаю, что ваш постоянный термин является и запутанным, и неточным. Я предполагаю, что вы рассчитали, что (.000694) примерно равно значению минуты, а вы умножаете его на количество минут, которое вы хотите добавить (31 в примере, хотя в тексте вы сказали 30).

Я бы также начал с одного дня и разделил его на нужные вам единицы измерения в вашем коде. В этом случае (1/48) будет 30 минут; или если вы хотите разбить его на части для ясности, вы можете написать ((1/24) * (1/2)).

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

11 голосов
/ 22 февраля 2010

от 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
10 голосов
/ 11 июня 2013
UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

Где interval является одним из

  • год
  • МЕСЯЦ
  • ДЕНЬ
  • ЧАС
  • МИНУТЫ
  • ВТОРОЙ
7 голосов
/ 07 ноября 2016

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

3 голосов
/ 02 ноября 2008

Если тип данных поля - дата или отметка времени, Oracle всегда должен давать правильный результат, если вы добавляете правильное число, указанное в количестве дней (или в вашем случае правильную долю дня). Так что если вы пытаетесь увеличить значение в течение 30 минут, вы должны использовать:

select field + 0.5/24 from table;

Исходя из предоставленной вами информации, я считаю, что это то, что вы пытались сделать, и я совершенно уверен, что это работает.

2 голосов
/ 02 декабря 2010

Разве мы не можем использовать это

SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;

Я новичок в этом домене.

1 голос
/ 03 ноября 2008

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

1 голос
/ 02 ноября 2008

Убедитесь, что 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'

0 голосов
/ 17 декабря 2018

как это очень легко

я добавил 10 минут к системной дате и всегда предпочитал использовать функции сервера БД, а не пользовательские.

select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;
...