web-dev-qa-db-ja.com

ビューでUnixタイムスタンプをDATETIMEに変換する

UNIXタイムスタンプを格納するテーブルがあります。これを日付としてクエリするために、このタイムスタンプをビューの日時タイプに変換しようとしています。残念ながら、DATE部分のみを取得するように思えます。

このリンク は変換の方法を説明していますが、時間部分を含めるようにnls_date_formatを変更する必要があります。デフォルトでは現在、日付部分のみが表示されます。日時が必要です。

残念ながら、そのソリューションはセッションレベルでのみ機能します。開発者として、特に他のアプリケーションに影響を与える可能性があるため、マネージドサービスプロバイダーに出向いてデータベースレベルで値を変更するよう依頼する必要はありません。

システムを変更せずに、SQLのタイムスタンプを日時に変換する方法はありますか?

7
Josh Smeaton

式の結果

to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND')

oracleデータ型DATEの値です。このタイプには日付と時刻が含まれます。この値をユーザーに表示する場合は、文字列に変換する必要があります。この変換はアプリケーションで実行することも、この例のようにOracleに文字列型に変換させることもできます。 Oracle stringtype VARCHAR2へのこの自動変換は、nls_date_formatと一部のサーバー設定によって制御されます。ビューで、計算された日付が「YYYY-MM-DD HH24:MI:SS」の形式でVARCHAR2値を返し、DATE値を返さないようにする場合は、変換関数を使用してこれを行うことができます。

to_char(to_date('1970-01-01','YYYY-MM-DD') + numtodsinterval(1244108886,'SECOND'),'YYYY-MM-DD HH24:MI:SS')

ただし、この場合、ビューの戻り値はVARCHAR2であり、DATE値ではありません。

12
miracle173

関数が普遍的に使用できない可能性があるため、SQLクエリ内の非SQL関数呼び出しを回避することをお勧めします-私のシステムではnumtodsinterval関数はありません-コンテキストをSQLからPL/SQLに切り替えてから追加のオーバーヘッドがあるためwhere句で関数が呼び出された場合に返される、またはテストされるすべての行について、SQLに戻ります。

これはSQLのみのソリューションです。

TO_DATE('1970-01-01','YYYY-MM-DD') + unix_timestamp / 86400

結果はTIMEも含むOracle DATE値であることに注意してください。クエリを実行したときにTIMEがないように見える場合、問題はNLS_DATE_FORMATまたは日付を文字列に変換するUIの実装にあります。値全体を確認するには、フォーマット文字列の時間部分を使用して自分でTO_CHARを実行してください。例えばTO_CHAR(a_date、 'yyyy-mm-dd hh24:mi:ss')

5
user21435

この値を計算するために別の数値を使用しました。

select (TO_DATE('1970-01-01','YYYY-MM-DD') + unix_timestamp / 86400000) from dbname;

このスクリプトは私には問題ありません。

1
bpedroso

Unix_timestampをWHERE句の日付範囲と比較する必要がある場合は、すべてのunix_timestamp値を日付に変換するのではなく、日付をunix_timestampsに変換するのが最善です。

たとえば、次の例では、指定した開始日と終了日の間にUNIX_TIMESTAMPが含まれる行を検索できます。

WHERE unix_timestamp BETWEEN
       (:start_date - TO_DATE('1970-01-01','YYYY-MM-DD')) * 86400
       AND 
       (:end_date - TO_DATE('1970-01-01','YYYY-MM-DD')) * 86400

これにより、UNIX_TIMESTAMPにインデックスがあれば、それを使用することもできます。

0
user21435