カテゴリ:

変換関数日付と時刻の関数

TO_TIMESTAMP / TO_TIMESTAMP_*

入力式を対応するタイムスタンプに変換します:

  • TO_TIMESTAMP_LTZ (現地時間帯のタイムスタンプ)

  • TO_TIMESTAMP_NTZ (タイムゾーンなしのタイムスタンプ)

  • TO_TIMESTAMP_TZ (タイムゾーン付きのタイムスタンプ)

注釈

TO_TIMESTAMP TIMESTAMP_TYPE_MAPPING セッションパラメーターに基づいて、他のタイムスタンプ関数の1つにマッピングします。パラメータのデフォルトは TIMESTAMP_NTZ であるため、 TO_TIMESTAMP はデフォルトで TO_TIMESTAMP_NTZ にマッピングされます。

こちらもご参照ください。

TRY_TO_TIMESTAMP / TRY_TO_TIMESTAMP_*

AS_TIMESTAMP_*IS_TIMESTAMP_*

TO_DATE , DATETO_TIME , TIME

構文

timestampFunction ( <numeric_expr> [ , <scale> ] )

timestampFunction ( <date_expr> )

timestampFunction ( <timestamp_expr> )

timestampFunction ( <string_expr> [ , <format> ] )

timestampFunction ( '<integer>' )

timestampFunction ( <variant_expr> )

条件:

timestampFunction ::=
    TO_TIMESTAMP | TO_TIMESTAMP_LTZ | TO_TIMESTAMP_NTZ | TO_TIMESTAMP_TZ

引数

必須:

次のいずれか:

数値式

Unixエポック(1970-01-01 00:00:00 UTC)の開始からの秒数(スケール= 0または存在しない場合)または秒の小数部(ミリ秒またはナノ秒など)。非整数の10進数式が入力されると、結果のスケールが継承されます。

日付式

タイムスタンプに変換される日付。

タイムスタンプ式

別のタイムスタンプに変換されるタイムスタンプ(例: TIMESTAMP_LTZ を TIMESTAMP_NTZに変換)。

文字列式

タイムスタンプの抽出元の文字列。例:「2019-01-31 01:02:03.004」。

整数

整数を含む 文字列 に評価される式。例:「15000000」。文字列の大きさに応じて、秒、ミリ秒、マイクロ秒、またはナノ秒として解釈できます。詳細については、以下の使用上の注意をご参照ください。

バリアント式

VARIANT型の式。 VARIANT には次のいずれかが含まれている必要があります。

  • タイムスタンプの抽出元の文字列。

  • タイムスタンプ。

  • 秒またはミリ秒の整数。

  • 秒またはミリ秒の整数を含む文字列。

TO_TIMESTAMP は DATE 値を受け入れますが、 VARIANT内の DATE は受け入れません。

オプション:

形式

フォーマット指定子( 文字列式 のみ)。詳細については、 変換関数日付と時刻の形式 をご参照ください。

デフォルト値は、 TIMESTAMP_INPUT_FORMAT パラメーターの現在の値(通常は AUTO)です。

スケール

スケール指定子( 数値式 のみ)。指定されている場合、提供される数値のスケールを定義します。例:

  • 秒の場合、スケール= 0。

  • ミリ秒の場合、スケール= 3。

  • ナノ秒の場合、スケール= 9。

使用上の注意

  • この関数ファミリーは、タイムスタンプ値を返します。詳細は次のとおりです。

    • NULL 入力の場合、結果は NULLになります。

    • 文字列式 の場合:指定された文字列で表されるタイムスタンプ。文字列に時刻コンポーネントがない場合、午前0時が使用されます。

    • 日付式 の場合特定のタイムスタンプ型(NTZ/LTZ/TZ)セマンティクスに従って、特定の日の午前0時を表すタイムスタンプが使用されます。

    • タイムスタンプ式 の場合:元のタイムスタンプ型とは異なるタイムスタンプ型。

    • 数値式 の場合:ユーザーが提供する秒数(または秒の小数部)を表すタイムスタンプ。 UTC 時間は常に結果の作成に使用されることに注意してください。

    • バリアント式 の場合:

      • バリアントに JSON null 値が含まれる場合、結果は NULLになります。

      • バリアントに結果と同じ種類のタイムスタンプ値が含まれている場合、この値はそのまま保持されます。

      • バリアントに異なる種類のタイムスタンプ値が含まれる場合、変換は タイムスタンプ式 と同じ方法で実行されます。

      • バリアントに文字列が含まれている場合、文字列値からの変換が実行されます(自動フォーマットを使用)。

      • バリアントに数値が含まれている場合、 数値式 からの変換が実行されます。

        注釈

        When an INTEGER value is cast directly to TIMESTAMP_NTZ, the integer is treated as the number of seconds since the beginning of the Linux epoch, and the local time zone is not taken into account. (For details, see TO_TIMESTAMP / TO_TIMESTAMP_*.) However, if the INTEGER value is stored inside a VARIANT value, for example as shown below, then the conversion is indirect, and is affected by the local time zone, even though the final result is TIMESTAMP_NTZ:

        select to_timestamp(parse_json(31000000));
        select parse_json(31000000)::timestamp_ntz;
        

        ローカルタイムゾーンとは独立して変換するには、以下に示すように、式の整数に明示的なキャストを追加します。

        select to_timestamp(parse_json(31000000)::int);
        select parse_json(31000000)::int::timestamp_ntz;
        

        これは、 TIMESTAMP_NTZ にキャストするか、関数 TO_TIMESTAMP_NTZ()を呼び出すかのいずれかに適用されます。 TIMESTAMP_TYPE_MAPPING パラメーターが TIMESTAMP_NTZに設定されているときに、 TO_TIMESTAMP()を呼び出す場合にも適用されます。

        出力の例については、このトピックの最後にある例をご参照ください。

    • 変換できない場合、エラーが返されます。

  • 入力パラメーターの形式が整数を含む文字列の場合:

    • 文字列が整数に変換された後、Unixエポックの開始後の秒数、ミリ秒、マイクロ秒、またはナノ秒として整数が扱われます(1970-01-01 00:00:00.000000000 UTC)。

      • 整数が31536000000(1年のミリ秒数)より小さい場合、値は秒数として扱われます。

      • 値が31536000000以上で31536000000000未満の場合、値はミリ秒として扱われます。

      • 値が31536000000000以上で31536000000000000より小さい場合、値はマイクロ秒として扱われます。

      • 値が31536000000000000以上の場合、値はナノ秒として扱われます。

    • 複数の行が評価される場合(例えば、入力が3つ以上の行を含むテーブルの列名である場合)、最初に処理される値は、後続のすべての値が秒、ミリ秒、マイクロ秒、またはナノ秒として扱われるかどうかを決定します。

      最初の値が31536000000以上の場合、残りの値が31536000000未満であっても、すべての値はミリ秒として扱われます。同様のロジックがマイクロ秒とナノ秒に適用されます。

    ご用心

    現在、負の値は常に秒として扱われます。例えば、-31536000000000000000は1970年の前の秒数として扱われますが、そのスケールは、ナノ秒として使用することを意図していることを示しています。

    この動作は将来変更される可能性があります。

    ご用心

    非推奨の警告:Snowflakeの将来のバージョンでは、文字列化された整数値をミリ秒、マイクロ秒、ナノ秒ではなく、秒として自動的に解釈する可能性があります。Snowflakeは、整数が秒として解釈されることが意図されている場合にのみ、整数を含む文字列で TO_DATE または TO_TIMESTAMP を呼び出すことをお勧めします。

これは、 TO_TIMESTAMP_TZ がセッションのタイムゾーンを含むタイムスタンプを作成しますが、 TO_TIMESTAMP_NTZ の値にはタイムゾーンがないことを示しています:

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';
+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SELECT TO_TIMESTAMP_TZ('2013-04-05 01:02:03');
+----------------------------------------+
| TO_TIMESTAMP_TZ('2013-04-05 01:02:03') |
|----------------------------------------|
| 2013-04-05 01:02:03.000 -0700          |
+----------------------------------------+

SELECT TO_TIMESTAMP_NTZ('2013-04-05 01:02:03');
+-----------------------------------------+
| TO_TIMESTAMP_NTZ('2013-04-05 01:02:03') |
|-----------------------------------------|
| 2013-04-05 01:02:03.000                 |
+-----------------------------------------+

これは、さまざまな形式があいまいな日付の解析にどのように影響するかを示しています:

SELECT TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'mm/dd/yyyy hh24:mi:ss');
+-----------------------------------------------------------------+
| TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'MM/DD/YYYY HH24:MI:SS') |
|-----------------------------------------------------------------|
| 2013-04-05 01:02:03.000 -0700                                   |
+-----------------------------------------------------------------+

SELECT TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'dd/mm/yyyy hh24:mi:ss');
+-----------------------------------------------------------------+
| TO_TIMESTAMP_TZ('04/05/2013 01:02:03', 'DD/MM/YYYY HH24:MI:SS') |
|-----------------------------------------------------------------|
| 2013-05-04 01:02:03.000 -0700                                   |
+-----------------------------------------------------------------+

これは、1970年1月1日の深夜( UNIX EPOCHの始まり)からおよそ40年を表す数値入力の使用方法を示しています:

ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM TZD';
+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400);
+---------------------------------------+
| TO_TIMESTAMP_NTZ(40 * 365.25 * 86400) |
|---------------------------------------|
| 2010-01-01 00:00:00.000               |
+---------------------------------------+

これは前の例と似ていますが、3の スケール 値を指定することで値をミリ秒として提供します。

ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM TZD';
+----------------------------------+
| status                           |
|----------------------------------|
| Statement executed successfully. |
+----------------------------------+
SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3);
+-------------------------------------------------------+
| TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3) |
|-------------------------------------------------------|
| 2010-01-01 00:00:00.456                               |
+-------------------------------------------------------+

次の例は、変換された最初の値が、後続の値を秒またはミリ秒として解釈するかどうかを制御する方法を示しています。

テーブルを作成してロードします。

CREATE TABLE demo1 (
    description VARCHAR,
    value VARCHAR -- yes, string rather than bigint
    );

次の2つのクエリの出力を比較してください。2つの唯一の違いは、行の順序です。

SELECT 
       description, 
       value, 
       TO_TIMESTAMP(value), 
       TO_DATE(value)
    FROM demo1
    ORDER BY value ASC
    ;
+--------------+-------------+-------------------------+----------------+
| DESCRIPTION  | VALUE       | TO_TIMESTAMP(VALUE)     | TO_DATE(VALUE) |
|--------------+-------------+-------------------------+----------------|
| Seconds      | 31535999999 | 2969-05-02 23:59:59.000 | 2969-05-02     |
| Milliseconds | 31536000000 | 2969-05-03 00:00:00.000 | 2969-05-03     |
+--------------+-------------+-------------------------+----------------+
SELECT 
       description, 
       value, 
       TO_TIMESTAMP(value), 
       TO_DATE(value)
    FROM demo1
    ORDER BY value DESC
    ;
+--------------+-------------+-------------------------+----------------+
| DESCRIPTION  | VALUE       | TO_TIMESTAMP(VALUE)     | TO_DATE(VALUE) |
|--------------+-------------+-------------------------+----------------|
| Milliseconds | 31536000000 | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Seconds      | 31535999999 | 1970-12-31 23:59:59.999 | 1970-12-31     |
+--------------+-------------+-------------------------+----------------+

次の例は、整数を使用する場合と整数を含むバリアントを使用する場合の動作の違いを示しています。

SELECT 0::TIMESTAMP_NTZ, PARSE_JSON(0)::TIMESTAMP_NTZ, PARSE_JSON(0)::INT::TIMESTAMP_NTZ;
+-------------------------+------------------------------+-----------------------------------+
| 0::TIMESTAMP_NTZ        | PARSE_JSON(0)::TIMESTAMP_NTZ | PARSE_JSON(0)::INT::TIMESTAMP_NTZ |
|-------------------------+------------------------------+-----------------------------------|
| 1970-01-01 00:00:00.000 | 1969-12-31 16:00:00.000      | 1970-01-01 00:00:00.000           |
+-------------------------+------------------------------+-----------------------------------+
SELECT TO_TIMESTAMP_NTZ(0), TO_TIMESTAMP_NTZ(PARSE_JSON(0)), TO_TIMESTAMP_NTZ(PARSE_JSON(0)::INT);
+-------------------------+---------------------------------+--------------------------------------+
| TO_TIMESTAMP_NTZ(0)     | TO_TIMESTAMP_NTZ(PARSE_JSON(0)) | TO_TIMESTAMP_NTZ(PARSE_JSON(0)::INT) |
|-------------------------+---------------------------------+--------------------------------------|
| 1970-01-01 00:00:00.000 | 1969-12-31 16:00:00.000         | 1970-01-01 00:00:00.000              |
+-------------------------+---------------------------------+--------------------------------------+