コンテキストは、エポック番号を生成して既存の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クエリでこれらの関数(または他の関数)を使用してエポックをその時間レベルに変換する方法は?さらに、私が参照しているこれらの関数は、カスタムまたは特定の場所にある可能性があります。これは、ドキュメントまたはこれへの参照が表示されないためです。
エポックからのミリ秒から変換するには(エポックが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;
お役に立てば幸いです。
別のオプションは、間隔タイプを使用することです。
SELECT TO_TIMESTAMP('1970-01-01 00:00:00.0'
,'YYYY-MM-DD HH24:MI:SS.FF'
) + NUMTODSINTERVAL(1493963084212/1000, 'SECOND')
FROM dual;
ミリ秒が削減されないという利点があります。
エポック時間が整数として保存されている場合.....そして、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.
私は誰かがこれの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の数値です。
ここでは、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;