カテゴリ:

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

TO_DATE , DATE

入力式を日付に変換します。

  • 文字列式の場合、文字列を日付に変換した結果。

  • タイムスタンプ式の場合、タイムスタンプからの日付。

  • バリアント式の場合:

    • バリアントに文字列が含まれている場合、文字列変換が実行されます。

    • バリアントに日付が含まれる場合、日付値はそのまま保持されます。

    • バリアントに JSON null 値が含まれている場合、出力は NULLです。

  • NULL 入力の場合、出力は NULLです。

他のすべての値については、変換エラーが生成されます。

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

TRY_TO_DATE

構文

TO_DATE( <string_expr> [, <format> ] )
TO_DATE( <timestamp_expr> )
TO_DATE( '<integer>' )
TO_DATE( <variant_expr> )

DATE( <string_expr> [, <format> ] )
DATE( <timestamp_expr> )
DATE( '<integer>' )
DATE( <variant_expr> )

引数

必須:

次のいずれか:

タイムスタンプ式

TIMESTAMP 式。 TIMESTAMP の DATE 部分が抽出されます。

文字列式

日付の抽出元の文字列。例:「2019-01-31」。

整数

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

バリアント式

VARIANT型の式。 VARIANT には、 DATE、または INTEGERを含む文字列が含まれている必要があります。(タイムスタンプを含む VARIANT を渡すと、TO_DATE はエラーを返します。)

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

  • 日付を抽出する文字列。

  • A date.

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

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

オプション:

形式

Snowflakeが形式の解釈を指定する 文字列式 または AUTOの日付形式指定子です。詳細については、 変換関数の日付と時刻の形式 をご参照ください。

デフォルトは、 DATE_INPUT_FORMAT セッションパラメーターの現在の値です(通常は AUTO)。

使用上の注意

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

    • 文字列が整数に変換された後、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_DATE()関数の使用方法を示しています。

SELECT TO_DATE('2013-05-17'), DATE('2013-05-17');
+-----------------------+--------------------+
| TO_DATE('2013-05-17') | DATE('2013-05-17') |
|-----------------------+--------------------|
| 2013-05-17            | 2013-05-17         |
+-----------------------+--------------------+
SELECT TO_DATE('2012.07.23', 'YYYY.MM.DD'), DATE('2012.07.23', 'YYYY.MM.DD');
+-------------------------------------+----------------------------------+
| TO_DATE('2012.07.23', 'YYYY.MM.DD') | DATE('2012.07.23', 'YYYY.MM.DD') |
|-------------------------------------+----------------------------------|
| 2012-07-23                          | 2012-07-23                       |
+-------------------------------------+----------------------------------+
SELECT TO_DATE('1999-01-02', 'AUTO'), DATE('1999-01-02', 'AUTO');
+-------------------------------+----------------------------+
| TO_DATE('1999-01-02', 'AUTO') | DATE('1999-01-02', 'AUTO') |
|-------------------------------+----------------------------|
| 1999-01-02                    | 1999-01-02                 |
+-------------------------------+----------------------------+
SELECT TO_DATE('02/14/2014', 'MM/DD/YYYY'), DATE('02/14/2014', 'MM/DD/YYYY');
+-------------------------------------+----------------------------------+
| TO_DATE('02/14/2014', 'MM/DD/YYYY') | DATE('02/14/2014', 'MM/DD/YYYY') |
|-------------------------------------+----------------------------------|
| 2014-02-14                          | 2014-02-14                       |
+-------------------------------------+----------------------------------+

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

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

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     |
+--------------+-------------+-------------------------+----------------+