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

'HH24:MI:SSxFF6'の形式のvarchar2フィールドを2番目の間隔時間(6)としてどのように選択しますか?

    TO_DSINTERVALを使用できます 機能 ; CTEを使用してテーブルを複製する例:

    WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
    SELECT TO_DSINTERVAL('0 ' || time_field)
    FROM some_table;
    
    TO_DSINTERVAL('0'||TIME_FIELD)
    ---------------------------------------------------------------------------
    +000000000 00:00:00.000000000
    

    関数が認識できる形式にするには、「日」の部分を指定する必要があることに注意してください。したがって、ダミーの '0'が先頭に追加されます。 文字列。

    固定値クエリは、わずかに異なる形式を返します(または、少なくともわずかに異なる表示になります。間隔のdaaタイプにはフォーマットモデルがありません 日付とまったく同じ方法なので、正確に表現する方法がわかりません):

    SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
    FROM DUAL;
    
    INTERVAL'00:00:00.000000'HOURTOSECOND(6)
    ---------------------------------------------------------------------------
    +00 00:00:00.000000
    

    それを複製するには、キャストできます 必要な場合はこれ:

    WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
    SELECT CAST(TO_DSINTERVAL('0 ' || time_field) AS INTERVAL DAY TO SECOND(6))
    FROM some_table;
    
    CAST(TO_DSINTERVAL('0'||TIME_FIELD)ASINTERVALDAYTOSECOND(6))
    ---------------------------------------------------------------------------
    +00 00:00:00.000000
    

    ...または単に:

    WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
    SELECT CAST('0 ' || time_field AS INTERVAL DAY TO SECOND(6))
    FROM some_table;
    
    CAST('0'||TIME_FIELDASINTERVALDAYTOSECOND(6))
    ---------------------------------------------------------------------------
    +00 00:00:00.000000
    

    ...これは@catcallが最初に提案したものとほぼ同じですが、これには '0'も必要です。 先頭に追加するか、 ORA-01867を取得します 。 (または、 HOUR TO SECONDを使用しようとした場合 、 ORA-00963 、追加された日の値でも)。しかし、私はそれが暗黙の TO_DSINTERVAL を実行していると推測します(そしてそれはほんの少しの教育を受けていますが、単なる推測です)。 または同様のものであり、明示的なものを使用したいと思うので、何が起こっているのかを確信していました。それは私だけかもしれませんが...

    サンプルデータを使用して、私も ORA-01867を取得します 、ただし、null値が原因です。 caseを使用できます 結果でそれをnullのままにするには:

    SELECT CASE WHEN time_field IS NULL THEN null
        ELSE CAST('0 ' || time_field AS INTERVAL DAY TO SECOND(6)) END
    FROM some_table;
    
    CASEWHENTIME_FIELDISNULLTHENNULLELSECAST('0'||TIME_FIELDASINTERVALDAYTOSECO
    ---------------------------------------------------------------------------
    +00 10:00:00.000000
    +00 12:00:00.000000
    +00 15:00:00.000000
    +00 17:00:00.000000
    +00 20:00:00.000000
    
    
    6 rows selected.
    


    1. PostgreSQL-異なるタイムゾーンで日付をレンダリングする方法は?

    2. Hekatonのネイティブにコンパイルされたストアドプロシージャを呼び出さない方法

    3. 1対すべての関係への外部キー

    4. Hibernateの最も単純な1対多のマップケースはMySQLでは機能しません