web-dev-qa-db-ja.com

Oracle:タイムスタンプに分を追加する方法は?

Oracleの日付列の値に30分を追加する必要があります。これをSELECTステートメントで指定するには、次のようにします。

to_char(date_and_time + (.000694 * 31)

ほとんどの場合、問題なく動作します。しかし、時刻が午前/午後の境界にあるときは違います。たとえば、12:30 [PM]に30分を追加すると、AMである1:00が返されます。私が期待する答えは13:00です。これを行う正しい方法は何ですか?

39
Sajee

他のすべての答えは基本的に正しいですが、誰もあなたの元の質問に直接答えたとは思いません。

あなたの例の「date_and_time」がタイプDATEまたはTIMESTAMPの列であると仮定すると、これを変更する必要があるだけだと思います。

to_char(date_and_time + (.000694 * 31))

これに:

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

デフォルトの日付形式では、「HH24」ではなく「HH」コードを使用しているようです。

また、あなたの一定の用語は紛らわしく、不正確であると思います。あなたがやったことは、(。000694)が1分の値であると計算し、追加したい分数(例では31ですが、テキストでは30と言いました)で乗算しています。

また、1日から始めて、コード内で必要な単位に分割します。この場合、(1/48)は30分になります。または、わかりやすくするために分割したい場合は、((1/24)*(1/2))と記述できます。

これにより、丸め誤差(ここでは意味がないはずの浮動小数点に固有のものを除く)が回避され、少なくとも私にとっては明確になります。

29
Dave Costa

日付に日数を追加できることに加えて、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
122
Justin Cave
UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

ここで、interval

  • 時間
  • セカンド
13
jtomaszk

から http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value

SYSDATE疑似列は、現在のシステムの日付と時刻を示します。 SYSDATEに1を追加すると、日付が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
11
crazy

_interval '30' minute_または_interval '5' second_の方が30 / (24 * 60)または5 / (24 * 60 * 69)の方が読みやすいので、これにはintervalリテラルの使用を好みます。

例えば.

  • _some_date + interval '2' hour_
  • _some_date + interval '30' minute_
  • _some_date + interval '5' second_
  • _some_date + interval '2' day_

複数の単位を1つの式に結合することもできます。

  • _some_date + interval '2 3:06' day to minute_

日付値に2日、3時間、6分を加算します

上記は標準SQLでもあり、他のいくつかのDBMSでも機能します。

マニュアルの詳細: https://docs.Oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00221

フィールドのデータ型が日付またはタイムスタンプである場合、日数で与えられた正しい数(または場合によっては1日の正しい部分)を追加すると、Oracleは常に正しい結果を与えるはずです。したがって、30分で値を上げようとする場合は、次のように使用する必要があります。

select field + 0.5/24 from table;

あなたが提供した情報に基づいて、私はこれがあなたがやろうとしたことだと信じており、私はそれがうまくいくと確信しています。

3

これは使えませんか

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

このドメインは初めてです。

2
saidevakumar

開始時刻がPMであることをOracleが理解していることと、最終出力に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'

1

あなたが求めていることに基づいて、to_charのHH24:MI形式が必要です。

1

Oracleで日付を編集するには、試すことができます

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

とても簡単に

私はシステム日付に10分を追加し、常に優先的にカスタムサーバー機能ではなくDbサーバー機能を使用します。

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