TO_DATE , DATE¶
入力式を日付に変換します。
文字列式の場合、文字列を日付に変換した結果。
タイムスタンプ式の場合、タイムスタンプからの日付。
バリアント式の場合:
バリアントに文字列が含まれている場合、文字列変換が実行されます。
バリアントに日付が含まれる場合、日付値はそのまま保持されます。
バリアントに JSON null 値が含まれている場合、出力は NULLです。
NULL 入力の場合、出力は NULLです。
他のすべての値については、変換エラーが生成されます。
- こちらもご参照ください:
構文¶
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 には次のいずれかが含まれている必要があります。
日付を抽出する文字列。
日付。
秒またはミリ秒の整数を含む文字列。
TO_DATE は TIMESTAMP 値を受け入れますが、 VARIANT内の TIMESTAMP は受け入れません。
オプション:
形式
文字列式
または AUTO の日付形式指定子。これは、Snowflakeが使用する形式を自動的に検出することを指定します。詳細については、 変換関数の日付と時刻の形式 をご参照ください。デフォルトは、 DATE_INPUT_FORMAT セッションパラメーターの現在の値です(通常は AUTO)。
戻り値¶
返される値のデータ型は DATE
です。
使用上の注意¶
入力パラメーターの形式が整数を含む文字列の場合:
文字列が整数に変換された後、Unixエポックの開始後の秒数、ミリ秒、マイクロ秒、またはナノ秒として整数が扱われます(1970-01-01 00:00:00.000000000 UTC)。
整数が31536000000(1年のミリ秒数)より小さい場合、値は秒数として扱われます。
値が31536000000以上で31536000000000未満の場合、値はミリ秒として扱われます。
値が31536000000000以上で31536000000000000より小さい場合、値はマイクロ秒として扱われます。
値が31536000000000000以上の場合、値はナノ秒として扱われます。
ご用心
現在、負の値は常に秒として扱われます。例えば、-31536000000000000000は1970年の前の秒数として扱われますが、そのスケールは、ナノ秒として使用することを意図していることを示しています。
この動作は将来変更される可能性があります。
注釈
非推奨の警告: Snowflakeの将来のバージョンでは、文字列化された整数値をミリ秒、マイクロ秒、ナノ秒ではなく、秒として自動的に解釈する可能性があります。Snowflakeは、整数が秒として解釈されることが意図されている場合にのみ、整数を含む文字列で TO_DATE、 TO_TIME または TO_TIMESTAMP を呼び出すことをお勧めします。
複数の行が評価される場合(たとえば、入力が1つ以上の行を含むテーブルの列名である場合) 最初 に処理される値は、後続の すべて の値が秒、ミリ秒、マイクロ秒、またはナノ秒として扱われるかどうかを決定します。
たとえば、最初の値が31536000000以上で31536000000000未満の場合、値 すべて はミリ秒として扱われます。
行を並行して処理するために、行のセットは、ユーザー(例: PARTITION BY 句を使用)またはSnowflakeのいずれかによってグループに分割できます。各グループの最初の行は、値がグループ全体の秒、ミリ秒、マイクロ秒、またはナノ秒として解釈されるかどうかを決定します。これにより、値の順序が変更されたときに異なる結果が生成される可能性があります。この問題を回避するには、関数の引数として、またはセッションパラメーターで、値に 入力形式 を指定します。
例¶
次の例は、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 ); INSERT INTO demo1 (description, value) VALUES ('Seconds', '31535999999'), ('Milliseconds', '31536000000') ;次の2つのクエリの出力を比較してください。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 | +--------------+-------------+-------------------------+----------------+2番目のクエリでは、最初の行の入力値がミリ秒数として扱われます。その結果、後続の行の入力値もミリ秒数として扱われます。
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 | +--------------+-------------+-------------------------+----------------+