カテゴリ:

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

TO_DATE , DATE

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

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

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

  • VARIANT 式の場合は、

    • VARIANT に文字列が含まれていると、文字列変換が実行されます。

    • VARIANT に日付が含まれていると、日付値はそのまま保持されます。

    • VARIANT に 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> )
Copy

引数

必須:

次のいずれか:

string_expr

日付を抽出する文字列。例: '2024-01-31'

timestamp_expr

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

'integer'

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

variant_expr

VARIANT 型の式。

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

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

  • 日付。

  • 秒またはミリ秒の数値を表現する整数を含む文字列。

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

オプション:

format

string_expr または AUTO の日付形式指定子。これは、Snowflakeが使用する形式を自動的に検出することを指定します。詳細については、 変換関数の日付と時刻の形式 をご参照ください。

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

戻り値

戻り値のデータ型は DATE です。入力が NULL の場合は NULL を返します。

使用上の注意

  • 出力における日付の表示形式は、 DATE_OUTPUT_FORMAT セッションパラメーター(デフォルト YYYY-MM-DD)によって決定されます。

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

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

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

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

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

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

    • 複数の行が評価される場合(例: 入力が複数の行を含むテーブルの列名である場合)、値が秒、ミリ秒、マイクロ秒、またはナノ秒を表しているかどうかを判断するために、各値が個別に検査されます。

以下の例では、 TO_DATE と DATE 関数を使用しています。

基本的な例

SELECT TO_DATE('2024-05-10'), DATE('2024-05-10');
Copy
+-----------------------+--------------------+
| TO_DATE('2024-05-10') | DATE('2024-05-10') |
|-----------------------+--------------------|
| 2024-05-10            | 2024-05-10         |
+-----------------------+--------------------+

タイムスタンプから日付を抽出する例

TO_DATE 関数は、 TIMESTAMP 値および TIMESTAMP 形式の文字列も受け入れますが、時間情報(時間、分など)は破棄します。

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

CREATE OR REPLACE TABLE date_from_timestamp(ts TIMESTAMP);

INSERT INTO date_from_timestamp(ts)
  VALUES (TO_TIMESTAMP('2024.10.02 04:00:00', 'YYYY.MM.DD HH:MI:SS'));
Copy

テーブルの TIMESTAMP 値をクエリします。

SELECT ts FROM date_from_timestamp;
Copy
+-------------------------+
| TS                      |
|-------------------------|
| 2024-10-02 04:00:00.000 |
+-------------------------+

TO_DATE 関数を使用して、テーブルの TIMESTAMP 値をクエリします。

SELECT TO_DATE(ts) FROM date_from_timestamp;
Copy
+-------------+
| TO_DATE(TS) |
|-------------|
| 2024-10-02  |
+-------------+

異なる入力形式を使用する例

以下の例では、 TO_DATE と DATE 関数を異なる入力形式指定で使用しています。返される出力の日付形式は、 DATE_OUTPUT_FORMAT セッションパラメーターの設定によって決まります。

SELECT TO_DATE('2024.05.10', 'YYYY.MM.DD'), DATE('2024.05.10', 'YYYY.MM.DD');
Copy
+-------------------------------------+----------------------------------+
| TO_DATE('2024.05.10', 'YYYY.MM.DD') | DATE('2024.05.10', 'YYYY.MM.DD') |
|-------------------------------------+----------------------------------|
| 2024-05-10                          | 2024-05-10                       |
+-------------------------------------+----------------------------------+
SELECT TO_DATE('2024-05-10', 'AUTO'), DATE('2024-05-10', 'AUTO');
Copy
+-------------------------------+----------------------------+
| TO_DATE('2024-05-10', 'AUTO') | DATE('2024-05-10', 'AUTO') |
|-------------------------------+----------------------------|
| 2024-05-10                    | 2024-05-10                 |
+-------------------------------+----------------------------+
SELECT TO_DATE('05/10/2024', 'MM/DD/YYYY'), DATE('05/10/2024', 'MM/DD/YYYY');
Copy
+-------------------------------------+----------------------------------+
| TO_DATE('05/10/2024', 'MM/DD/YYYY') | DATE('05/20/2024', 'MM/DD/YYYY') |
|-------------------------------------+----------------------------------|
| 2024-05-10                          | 2024-05-20                       |
+-------------------------------------+----------------------------------+

異なる出力形式を使用する例

以下の例は、 DATE_OUTPUT_FORMAT セッションパラメーターを DD-MON-YYYY に設定した場合のクエリの結果を示しています。

ALTER SESSION SET DATE_OUTPUT_FORMAT = 'DD-MON-YYYY';
Copy
SELECT TO_DATE('2024-05-10', 'YYYY-MM-DD'), DATE('2024-05-10', 'YYYY-MM-DD');
Copy
+-------------------------------------+----------------------------------+
| TO_DATE('2024-05-10', 'YYYY-MM-DD') | DATE('2024-05-10', 'YYYY-MM-DD') |
|-------------------------------------+----------------------------------|
| 10-May-2024                         | 10-May-2024                      |
+-------------------------------------+----------------------------------+
SELECT TO_DATE('05/10/2024', 'MM/DD/YYYY'), DATE('05/10/2024', 'MM/DD/YYYY');
Copy
+-------------------------------------+----------------------------------+
| TO_DATE('05/10/2024', 'MM/DD/YYYY') | DATE('05/10/2024', 'MM/DD/YYYY') |
|-------------------------------------+----------------------------------|
| 10-May-2024                         | 10-May-2024                      |
+-------------------------------------+----------------------------------+

整数を含む文字列を使用する例

入力が整数を含む文字列の場合、その整数の大きさは、秒、ミリ秒などとして解釈されるかどうかに影響します。次の例は、値の大きさに基づいて、関数が使用する単位(秒、ミリ秒、マイクロ秒、またはナノ秒)を選択する方法を示しています。

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

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

INSERT INTO demo1 (description, value) VALUES
  ('Seconds',      '31536000'),
  ('Milliseconds', '31536000000'),
  ('Microseconds', '31536000000000'),
  ('Nanoseconds',  '31536000000000000');
Copy

文字列を関数に渡します。

SELECT description,
       value,
       TO_TIMESTAMP(value),
       TO_DATE(value)
  FROM demo1
  ORDER BY value;
Copy
+--------------+-------------------+-------------------------+----------------+
| DESCRIPTION  | VALUE             | TO_TIMESTAMP(VALUE)     | TO_DATE(VALUE) |
|--------------+-------------------+-------------------------+----------------|
| Seconds      | 31536000          | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Milliseconds | 31536000000       | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Microseconds | 31536000000000    | 1971-01-01 00:00:00.000 | 1971-01-01     |
| Nanoseconds  | 31536000000000000 | 1971-01-01 00:00:00.000 | 1971-01-01     |
+--------------+-------------------+-------------------------+----------------+