web-dev-qa-db-ja.com

オラクルはUnixエポック時間を日付に変換します

コンテキストは、エポック番号を生成して既存のOracleプロシージャに送信し、その逆を行う製品に既存のアプリケーションがあるということです。このようなものを使用してその手順で動作します

SELECT UTC_TO_DATE (1463533832) FROM DUAL
SELECT date_to_utc(creation_date) FROM mytable

これらのクエリを試してみたところ、Oracle 10gサーバー(およびそれが重要な場合はOracle SQL Developer 4.x)でも機能します。

既存の手順では、要件は値を日付自体として保存することでした(時間コンポーネントは無関係です)が、新しい要件では、Unixエポック値を日時に変換する必要があります(時間/分/秒レベル、または特定のOracleクエリでの形式(dd-MMM-yyyy hh:mm:ssなど)。奇妙なことに、GoogleでUTC_TO_DATEおよびDATE_TO_UTC関数に関するドキュメントを見つけることができません。私はstackoverflowに関するすべての異なる質問を見てきましたが、それらのほとんどはphp、Javaなどのようなプログラミング言語に固有のものです。

結論として、Oracleクエリでこれらの関数(または他の関数)を使用してエポックをその時間レベルに変換する方法は?さらに、私が参照しているこれらの関数は、カスタムまたは特定の場所にある可能性があります。これは、ドキュメントまたはこれへの参照が表示されないためです。

5
Subhash Dike

エポックからのミリ秒から変換するには(エポックが1970年1月1日であると仮定します):

select to_date('19700101', 'YYYYMMDD') + ( 1 / 24 / 60 / 60 / 1000) * 1322629200000
from dual;

11/30/2011 5:00:00 AM

その日付をミリ秒に戻すには:

select (to_date('11/30/2011 05:00:00', 'MM/DD/YYYY HH24:MI:SS') - to_date('19700101', 'YYYYMMDD')) * 24 * 60 * 60 * 1000
from dual;

1322629200000

ミリ秒ではなく秒の場合、式の1000の部分を省略します。

select to_date('19700101', 'YYYYMMDD') + ( 1 / 24 / 60 / 60 ) * 1322629200
from dual;

select (to_date('11/30/2011 05:00:00', 'MM/DD/YYYY HH24:MI:SS') - to_date('19700101', 'YYYYMMDD')) * 24 * 60 * 60
from dual;

お役に立てば幸いです。

15
tbone

別のオプションは、間隔タイプを使用することです。

SELECT TO_TIMESTAMP('1970-01-01 00:00:00.0'
                   ,'YYYY-MM-DD HH24:MI:SS.FF'
       ) + NUMTODSINTERVAL(1493963084212/1000, 'SECOND')
FROM dual;

ミリ秒が削減されないという利点があります。

7
kpater87

エポック時間が整数として保存されている場合.....そして、Oracle日付形式への変換を希望します。

手順1->エポック日付(1462086000)を標準の01-jan-1970に追加します。 86400は24時間の秒です。

*Select TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 from dual*  
   **output is 5/1/2016 7:00:00 AM**

ステップ2-> CHARに変換します。これは、追加の機能を適用する前にフォーマットするために必要です。

  *Select TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss') from dual*

   output is  2016-05-01 07:00:00

ステップ3->今タイムスタンプ変換に

Select to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss') from dual

  output is 5/1/2016 7:00:00.000000000 AM

ステップ4-> TimeZone、UTCの使用が必要になりました

Select from_tz(to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'UTC')  from dual

     output is 5/1/2016 7:00:00.000000000 AM +00:00

ステップ5->タイムゾーンのニーズがPSTの場合

 Select from_tz(to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'UTC')  at time zone 'America/Los_Angeles' TZ from dual

           output is 5/1/2016 12:00:00.000000000 AM -07:00

ステップ6-> PST Timezoneタイムスタンプをフォーマットします。

 Select to_Char(from_tz(to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'UTC')  at time zone 'America/Los_Angeles' ,'DD-MON-YYYY HH24:MI:SS') TZ from dual 

          output is  01-MAY-2016 00:00:00

ステップ7->最後に、列が日付データ型の場合

   Add to_DATE to the whole above Select. 
1
Bashobi

私は誰かがこれのOracle関数バージョンを見ることに興味があると思った:

CREATE OR REPLACE FUNCTION unix_to_date(unix_sec NUMBER)
RETURN date
IS
ret_date DATE;
BEGIN
    ret_date:=TO_DATE('19700101','YYYYMMDD')+( 1/ 24/ 60/ 60)*unix_sec;
    RETURN ret_date;
END;
/

日付が必要なレコードがたくさんあったので、テーブルを次のように更新しました。

update bobfirst set entered=unix_to_date(1500000000+a);

ここで、aは1〜10,000,000の数値です。

1
user1683793

ここでは、UTC/GMTとESTの両方に対応しています。

GMT  select (to_date('1970-01-01 00','yyyy-mm-dd hh24') +
     (1519232926891)/1000/60/60/24) from dual;

EST  select new_time(to_date('1970-01-01 00','yyyy-mm-dd hh24') + 
     (1519232926891)/1000/60/60/24, 'GMT', 'EST') from dual;
0
Paul