sql >> データベース >  >> RDS >> Oracle

このタイムスタンプを希望の形式で取得するにはどうすればよいですか、Oracle SQL

    @Gordonが言ったように、タイムスタンプ(および日付)は、Oracleが実際に知る必要も調べる必要もない内部表現を使用していることを認識できる形式で保存されません(ただし、そのようなことに興味がある場合は文書化されています) 。

    タイムスタンプを照会すると、それらをオーバーライドするクライアントがない限り、クライアントのNLS設定を使用して表示されます。私はあなたが見ているものと一致するように私のセッションを設定することができます:

    alter session set nls_timestamp_format = 'DD-MON-RR HH.MI.SS.FF AM';
    
    select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;
    
    TO_CHAR(SYSTIMESTAM
    -------------------
    2018-07-10 15:37:31
    
    select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;
    
    TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
    -------------------------------
    10-JUL-18 03.37.31.000000000 PM
    

    そして、私はあなたが見たいものを見るためにそれを変えることができます:

    alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';
    
    select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;
    
    TO_TIMESTAMP(TO_CHA
    -------------------
    2018-07-10 15:37:32
    

    しかし、あなたがしているのは、タイムゾーン付きのタイムスタンプから変換することだけです(これがsystimestamp is)文字列に変換してから、タイムスタンプに戻します。タイムゾーン部分と秒の端数が失われています。 castでも実行できます :

    select cast(systimestamp as timestamp(0)) from dual;
    
    CAST(SYSTIMESTAMPAS
    -------------------
    2018-07-10 15:37:32
    

    デフォルトのtimestamp_tzでタイムゾーンと分数秒を確認できます 形式:

    select systimestamp from dual;
    
    SYSTIMESTAMP                        
    ------------------------------------
    2018-07-10 15:37:33.776469000 +01:00
    

    別のalterで変更します :

    alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM';
    
    select systimestamp from dual;
    
    SYSTIMESTAMP                  
    ------------------------------
    2018-07-10 15:37:34.070 +01:00
    

    これは、タイムスタンプをテーブルに格納することについて実際に話している場合は完全には関係ありませんが、バリエーションがあることを示しています。

    テーブルでデータ型をtimestampにします (またはtimestamp with time zone またはtimestamp with local time zone )、そして可能な限り最後の瞬間に、エンドユーザーに提示するための文字列として値をフォーマットすることだけを心配します。

    表示する必要がある場合、表示形式が重要な場合は、to_char()を使用してください。 明示的なフォーマットマスクを使用する-クエリを実行している他の人が同じNLS設定を持っていると想定しないでください。ご覧のとおり、これらを変更して出力を変更するのは簡単です。 (ほとんどのクライアントにはデフォルトを設定できる方法があるため、同じalterを実行する必要はありません。 接続するたびにコマンド。例えばSQL Developerで、「ツール」->「設定」->「データベース」->「NLS」から)。常に同じ形式を表示したい場合は、次のようなものを使用してください:

    select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') as column_alias
    from your_table
    where your_column < timestamp '2018-01-01 00:00:00'
    

    これは、タイムスタンプリテラルを使用して(まだタイムスタンプとして)フィルタリングされている列値も示しています。



    1. ユーザー'root'@'localhost'のアクセスが拒否されました(パスワードを使用:YES)

    2. PDO::FETCH_ASSOCからの連想配列値の参照

    3. TOP句を使用して、SQLServerクエリで返される行を制限する

    4. SELECT FORUPDATEを使用する理由