UNIXタイムスタンプを格納するテーブルがあります。これを日付としてクエリするために、このタイムスタンプをビューの日時タイプに変換しようとしています。残念ながら、DATE部分のみを取得するように思えます。
このリンク は変換の方法を説明していますが、時間部分を含めるようにnls_date_format
を変更する必要があります。デフォルトでは現在、日付部分のみが表示されます。日時が必要です。
残念ながら、そのソリューションはセッションレベルでのみ機能します。開発者として、特に他のアプリケーションに影響を与える可能性があるため、マネージドサービスプロバイダーに出向いてデータベースレベルで値を変更するよう依頼する必要はありません。
システムを変更せずに、SQLのタイムスタンプを日時に変換する方法はありますか?
式の結果
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値ではありません。
関数が普遍的に使用できない可能性があるため、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')
この値を計算するために別の数値を使用しました。
select (TO_DATE('1970-01-01','YYYY-MM-DD') + unix_timestamp / 86400000) from dbname;
このスクリプトは私には問題ありません。
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にインデックスがあれば、それを使用することもできます。