Oracleの日付列の値に30分を追加する必要があります。これをSELECTステートメントで指定するには、次のようにします。
to_char(date_and_time + (.000694 * 31)
ほとんどの場合、問題なく動作します。しかし、時刻が午前/午後の境界にあるときは違います。たとえば、12:30
[PM]に30分を追加すると、AMである1:00
が返されます。私が期待する答えは13:00
です。これを行う正しい方法は何ですか?
他のすべての答えは基本的に正しいですが、誰もあなたの元の質問に直接答えたとは思いません。
あなたの例の「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))と記述できます。
これにより、丸め誤差(ここでは意味がないはずの浮動小数点に固有のものを除く)が回避され、少なくとも私にとっては明確になります。
日付に日数を追加できることに加えて、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
UPDATE "TABLE"
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute
WHERE (...)
ここで、interval
は
から 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
_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;
あなたが提供した情報に基づいて、私はこれがあなたがやろうとしたことだと信じており、私はそれがうまくいくと確信しています。
これは使えませんか
SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;
このドメインは初めてです。
開始時刻が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'
あなたが求めていることに基づいて、to_charのHH24:MI形式が必要です。
Oracleで日付を編集するには、試すことができます
select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>
とても簡単に
私はシステム日付に10分を追加し、常に優先的にカスタムサーバー機能ではなくDbサーバー機能を使用します。
select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;