日付と時刻のデータ型

Snowflakeは、日付、時刻、タイムスタンプ(日付と時刻の組み合わせ)を管理するデータ型をサポートしています。Snowflakeは、日付、時刻、タイムスタンプの操作に使用される文字列定数もサポートします。

データ型

Snowflake は以下の日付と時刻のデータ型をサポートしています。

注釈

DATE と TIMESTAMP のデータの場合、Snowflakeは、1582と9999の間の年を使用することをお勧めします。Snowflakeは、この範囲外の数年を受け入れますが、 グレゴリオ暦の制限 のため、1582より前の年は避ける必要があります。

DATE

Snowflakeは、日付を保存するための単一の DATE データ型をサポートしています(時間要素はなし)。

DATE は、最も一般的な形式(YYYY-MM-DDDD-MON-YYYY など)の日付を受け入れます。

また、 TIMESTAMP 値はすべて日付の入力として有効ですが、 TIME の情報は切り捨てられます。

DATETIME

DATETIME は、 TIMESTAMP_NTZと同義語です。

インターバルデータ型

間隔データ型は、期間を表す値を格納します。2つの日付または時刻の差として間隔を計算できます。間隔は期間のみを定義するため、時間の開始ポイントまたは終了ポイントはありません。たとえば、間隔を3年と7か月として定義できます。

Snowflakeは、年月を表すインターバルデータ型について、次のバリエーションをサポートしています。

データ型

説明

INTERVAL YEAR

期間を年単位で表します。

INTERVAL YEAR TO MONTH

期間を年と月で表します。

INTERVAL MONTH

期間を月で表します。

Snowflakeは、日数と時間を表すインターバルデータ型について、次のバリエーションをサポートしています。

データ型

説明

INTERVAL DAY

期間を日数で表します。

INTERVAL DAY TO HOUR

期間を日数と時間で表します。

INTERVAL DAY TO MINUTE

期間を日数、時間、分で表します。

INTERVAL DAY TO SECOND

期間を日、時間、分、秒、小数秒で表します。

INTERVAL HOUR

期間を時間単位で表します。

INTERVAL HOUR TO MINUTE

期間を時間と分で表します。

INTERVAL HOUR TO SECOND

期間を時間、分、秒、小数秒で表します。

INTERVAL MINUTE

期間を分単位で表します。

INTERVAL MINUTE TO SECOND

期間を分、秒、小数秒で表します。

INTERVAL SECOND

期間を秒と小数秒で表します。

次のセクションでは、インターバルデータ型の詳細について説明します。

注釈

日付と時刻の演算に:ref:`インターバル定数<label-interval_constants>`を使用することもできます。ただし、インターバル定数は、列タイプとしてのインターバルストレージをサポートしていません。

インターバルデータ型の利点

インターバルデータ型には、次の利点があります。

  • あいまいさのない正確な日付演算が保証される。

  • 整数ベースの期間データからの、手動による:doc:`変換やキャスト</sql-reference/data-type-conversion>`の必要性が排除される。

  • 時間の間隔を表すデータのストレージが最適化される。

  • 期間データのクエリ実行が最適化される。

  • Databricks、Oracle、Teradataなどのサードパーティデータベースからのデータ移行が簡素化される。

  • ANSI標準に完全に準拠できる。

インターバルデータ型の構文

インターバルデータ型を指定するには、次の構文を使用します。

INTERVAL { yearMonthQualifier | dayTimeQualifier }

条件:

yearMonthQualifier ::=
  {
    YEAR [ (<precision>) ] [ TO MONTH ]
    | MONTH [ (<precision>) ]
  }
dayTimeQualifier ::=
  {
    DAY [ (<precision>) ] [ TO { HOUR | MINUTE | SECOND [ (<fractional_seconds_precision>) ] } ]
    | HOUR [ (<precision>) ] [ TO { MINUTE | SECOND [ (<fractional_seconds_precision>) ] } ]
    | MINUTE [ (<precision>) ] [ TO SECOND [ (<fractional_seconds_precision>) ] ]
    | SECOND [ (<precision>) [ , (<fractional_seconds_precision>) ] ]
  }

プロパティ:

  • :samp:`{precision}`は、許可される合計桁数です。精度は``1``から``9``の範囲になります。

    デフォルト: 9

  • :samp:`{fractional_seconds_precision}`は、1秒未満の小数点以下の桁数を指します。時間精度は``0``(秒)から``9``(ナノ秒)の範囲になります。

    デフォルト: 9

インターバルデータ型を指定する場合は、この構文を使用します。例えば、次のテーブルにはINTERVAL YEAR TO MONTH型の``duration``列があります。

CREATE OR REPLACE TEMPORARY TABLE sample_table_with_interval (
  id VARCHAR,
  duration INTERVAL YEAR(2) TO MONTH);

間隔値の表現

間隔値を表すには、インターバルリテラルまたはインターバル形式を使用します。

インターバルリテラル

インターバルリテラルとは、文字列リテラルで期間を指定する式です。次の構文を使用して、インターバルリテラルを指定します。

INTERVAL '[ <sign> ] <string>' { <yearMonthQualifier> | <dayTimeQualifier> }

条件:

  • sign`は、正(:code:`+)または負(-)の期間を指定するオプションの記号です。

    デフォルト: +

  • :samp:`{string}`は、期間を表す値です。

  • :samp:`{yearMonthQualifier}`は:ref:`label-interval_syntax`で定義されている修飾子です。

  • :samp:`{dayTimeQualifier}`は:ref:`label-interval_syntax`で定義されている修飾子です。

インターバル形式

特定の形式の文字列リテラルは、間隔値を表すことができます。

年と月の値を指定するには、次の形式を使用します。

'<sign><Y>-<MM>'

条件:

  • sign`は、正(:code:`+)または負(-)の期間を指定する必須の記号です。

    デフォルト: +

  • :samp:`{Y}`は年数です。許可される桁数(精度)は、値のデータ型によって異なります。

  • :samp:`{MM}`は、``00``から``11``までの月数を表す2桁の数字です。

日、時間、秒、小数秒の値を指定するには、次の形式を使用します。

'<sign>[<D>] [<HH24>]:[<MI>]:[<SS>].[<F>]'

条件:

  • sign`は、正(:code:`+)または負(-)の期間を指定する必須の記号です。

    デフォルト: +

  • :samp:`{D}`は日数です。許可される桁数(精度)は、値のデータ型によって異なります。

    次の型の値では、:samp:`{D}`を省略します。

    • INTERVAL HOUR

    • INTERVAL HOUR TO MINUTE

    • INTERVAL HOUR TO SECOND

    • INTERVAL MINUTE

    • INTERVAL MINUTE TO SECOND

    • INTERVAL SECOND

  • :samp:`{HH24}`は、``00``から``23``までの時間数を表す2桁の数字です。

    次の型の値では、:samp:`{HH24}`を省略します。

    • INTERVAL DAY

    • INTERVAL MINUTE

    • INTERVAL MINUTE TO SECOND

    • INTERVAL SECOND

  • :samp:`{MI}`は、``00``から``59``までの分数を表す2桁の数字です。

    次の型の値では、:samp:`{MI}`を省略します。

    • INTERVAL DAY TO HOUR

    • INTERVAL DAY

    • INTERVAL HOUR

    • INTERVAL SECOND

  • :samp:`{SS}`は、``00``から``59``までの秒数を表す2桁の数字です。

    次の型の値では、:samp:`{SS}`を省略します。

    • INTERVAL DAY

    • INTERVAL DAY TO HOUR

    • INTERVAL DAY TO MINUTE

    • INTERVAL HOUR

    • INTERVAL HOUR TO MINUTE

    • INTERVAL MINUTE

  • :samp:`{F}`は、秒を含むデータ型における小数秒の桁数です。許可される桁数(精度)は、値のデータ型によって異なります。

インターバル形式の文字列リテラルには、次の使用上の注意が適用されます。

  • 文字列リテラル表現は、CASTまたはTO_CHAR関数を使用して間隔を明示的にテキスト文字列へキャストする場合に適用されます。

  • フィールドの先頭のゼロは精度を指定します。

間隔値の例

次のテーブルは、さまざまな間隔値を表す方法を示しています。テーブルに示す値は、間隔値に関する次のルールに従います。

  • 正の値の場合、プラス記号:code:`+`はインターバルリテラル値ではオプションですが、インターバル形式の値では必須です。

  • インターバルリテラル値では、括弧内の値で精度(許可される桁数)を指定します。例えば、``YEAR(3)``は、年に対して3桁の使用を許可することを指定するものです。

  • インターバル形式の値では、主フィールド(先頭のフィールド)には先頭のゼロが含まれません。下位フィールドでは固定桁数を使用します。例えば、``+1-08``のようなYEAR TO MONTH値の場合、年フィールドは先頭のゼロを持たず、月フィールドは2桁で表記されます。

期間

インターバルリテラル値

インターバル形式値

プラス5年

INTERVAL YEAR

INTERVAL'5' YEAR(2)

'+5'

プラス1年8か月

INTERVAL YEAR TO MONTH

INTERVAL'1-08' YEAR(3) TO MONTH

'+001-08'

マイナス5か月

INTERVAL MONTH

INTERVAL '-5' MONTH(2)

'-5'

プラス14か月

INTERVAL MONTH

INTERVAL'14' MONTH(2)

'+14'

マイナス44年11か月

INTERVAL YEAR TO MONTH

INTERVAL '-44-11' YEAR(2) TO MONTH

'-44-11'

プラス11日10時間9分

INTERVAL DAY TO MINUTE

INTERVAL'11 10:09' DAY(2) TO MINUTE

'+11 10:09'

プラス2日23時間8分23秒275ミリ秒

INTERVAL DAY TO SECOND

INTERVAL'02 23:08:23.275' DAY(2) TO SECOND(3)

'+2 23:08:23.275'

プラス4秒300ミリ秒

INTERVAL SECOND

INTERVAL'4.3' SECOND(5, 6)

'+4.300000'

日付と時刻の値を含む操作

次のテーブルは、間隔値を含む有効な算術演算の結果のデータ型を示しています。

最初のオペランド

演算子

2番目のオペランド

結果の型

タイムスタンプ

-

タイムスタンプ

インターバルデータ型

日付またはタイムスタンプ

+

間隔

DATE、 DATETIME、 TIMESTAMP_LTZ、 TIMESTAMP_NTZ、または TIMESTAMP_TZ

日付またはタイムスタンプ

-

間隔

DATE、 DATETIME、 TIMESTAMP_LTZ、 TIMESTAMP_NTZ、または TIMESTAMP_TZ

間隔

+

日付またはタイムスタンプ

DATE、 DATETIME、 TIMESTAMP_LTZ、 TIMESTAMP_NTZ、または TIMESTAMP_TZ

数値

*

間隔

インターバルデータ型

間隔

*

数値

インターバルデータ型

間隔

/

数値

インターバルデータ型

間隔

+

間隔

インターバルデータ型

間隔

-

間隔

インターバルデータ型

2つの間隔値を含む操作の場合、値は両方とも年月間隔値か、両方とも日時間隔値でなければなりません。年月間隔値と日時間隔値を混在させる操作はサポートされていません。操作に2つの年月間隔値が含まれる場合、結果の型は年月間隔型になります。操作に2つの日時間隔値が含まれる場合、結果の型は日時間隔型になります。

間隔値を引数として受け取る関数

次の関数は間隔値を引数として受け取ります。

インターバルデータ型の例

次の例は、インターバルデータ型の使用方法を示しています。

インターバルデータを使用して算術演算を実行する

次の例では、インターバルデータを使用して算術演算を実行します。

日付に1年と1か月を追加します。

SELECT TO_DATE('2024-01-01') + INTERVAL '1-1' YEAR TO MONTH
  AS date_plus_one_year_one_month;
+------------------------------+
| DATE_PLUS_ONE_YEAR_ONE_MONTH |
|------------------------------|
| 2025-02-01                   |
+------------------------------+

日付から1年と1か月を減算します。

SELECT TO_DATE('2024-01-01') + INTERVAL '-1-1' YEAR TO MONTH
  AS date_plus_one_year_one_month;
+------------------------------+
| DATE_PLUS_ONE_YEAR_ONE_MONTH |
|------------------------------|
| 2022-12-01                   |
+------------------------------+

タイムスタンプに期間を追加します。

SELECT TO_TIMESTAMP('2024-01-01 08:08:08.99') + INTERVAL '1 01:01:01.7878' DAY TO SECOND
  AS date_plus_period_of_time;
+--------------------------+
| DATE_PLUS_PERIOD_OF_TIME |
|--------------------------|
| 2024-01-02 09:09:10.777  |
+--------------------------+

次の例では、:doc:`/sql-reference/functions/system_typeof`関数を使用して、クエリが2つのタイムスタンプ値を減算したときにINTERVAL DAY TO SECOND値が返されることを示します。

SELECT SYSTEM$TYPEOF(TO_TIMESTAMP('2025-10-05 01:02:03') - TO_TIMESTAMP('2025-09-15 11:36:22'))
  AS type;
+------------------------------------+
| TYPE                               |
|------------------------------------|
| INTERVAL DAY(9) TO SECOND(9)[SB16] |
+------------------------------------+

クエリの結果をインターバル形式で表示するには、式をINTERVAL DAY(2) TO SECOND(2)データ型にキャストして精度を指定し、次にVARCHARへキャストします。

SELECT (TO_TIMESTAMP('2025-10-05 01:02:03') - TO_TIMESTAMP('2025-09-15 11:36:22'))::INTERVAL DAY(2) TO SECOND(2)::VARCHAR
  AS interval_format_result;
+------------------------+
| INTERVAL_FORMAT_RESULT |
|------------------------|
| +19 13:25:41.00        |
+------------------------+
年月インターバルデータの挿入とクエリ

INTERVAL YEAR TO MONTH列で募集中のポジションの候補者を追跡するテーブルを作成し、データを挿入します。

CREATE OR REPLACE TABLE candidates (
  name_first VARCHAR,
  name_last VARCHAR,
  duration_of_experience INTERVAL YEAR(2) TO MONTH);

INSERT INTO candidates VALUES ('Jane', 'Smith', '14-4');
INSERT INTO candidates VALUES ('Robert', 'Adams', '0-3');
INSERT INTO candidates VALUES ('Mary', 'Jones', '5-11');

`duration_of_experience``列をデータ型にキャストせずにテーブルをクエリすると、出力には各行の合計月数として列の値が表示されます。

SELECT name_first,
       name_last,
       duration_of_experience AS months_of_experience
  FROM candidates;
+------------+-----------+----------------------+
| NAME_FIRST | NAME_LAST | MONTHS_OF_EXPERIENCE |
|------------+-----------+----------------------|
| Jane       | Smith     |                  172 |
| Robert     | Adams     |                    3 |
| Mary       | Jones     |                   71 |
+------------+-----------+----------------------+

テーブルをクエリして``duration_of_experience``列をVARCHARデータ型にキャストすると、出力には列の値がインターバル形式で表示されます。

SELECT name_first,
       name_last,
       duration_of_experience::VARCHAR AS duration_of_experience
  FROM candidates;
+------------+-----------+------------------------+
| NAME_FIRST | NAME_LAST | DURATION_OF_EXPERIENCE |
|------------+-----------+------------------------|
| Jane       | Smith     | +14-04                 |
| Robert     | Adams     | +0-03                  |
| Mary       | Jones     | +5-11                  |
+------------+-----------+------------------------+
日時インターバルデータを挿入しクエリを実行する

INTERVAL HOUR TO SECOND列でさまざまなソフトウェア機能のタイムアウト期間を指定するテーブルを作成し、データを挿入します。

CREATE OR REPLACE TABLE feature_timeouts (
  feature VARCHAR,
  timeout_duration INTERVAL HOUR(2) TO SECOND(0));

INSERT INTO feature_timeouts VALUES ('Feature1', '00:00:30');
INSERT INTO feature_timeouts VALUES ('Feature2', '00:10:00');
INSERT INTO feature_timeouts VALUES ('Feature3', '01:00:00');

テーブルをクエリし、``timeout_duration``列をVARCHARデータ型にキャストします。

SELECT feature,
       timeout_duration::VARCHAR AS timeout_duration
  FROM feature_timeouts;
+----------+------------------+
| FEATURE  | TIMEOUT_DURATION |
|----------+------------------|
| Feature1 | +0:00:30         |
| Feature2 | +0:10:00         |
| Feature3 | +1:00:00         |
+----------+------------------+
テーブルへインターバルデータをコピーし、テーブルのクエリを実行する

次の手順を実行して、インターバルデータを含むファイルをステージングし、ファイルをテーブルにコピーします。

  1. ファイルシステム上のファイルに、次の内容をコピーします。

    1,1-2,28 16:15:14.0
    2,-3-2,-54 16:15:14.123
    

    この例では、ファイルが``/examples/intervals/``ディレクトリ内の``interval_values.csv``という名前であることを前提としています。

  2. ステージを作成します。

    CREATE STAGE interval_stage;
    
  3. 内部ステージングの場所で、ファイルをステージングします。

    PUT file:///examples/intervals/interval_values.csv @~/interval_stage
      AUTO_COMPRESS=false;
    
  4. データのテーブルを作成します。

    CREATE OR REPLACE TABLE sample_interval_values(
      c1 STRING,
      c2 INTERVAL YEAR(1) TO MONTH,
      c3 INTERVAL DAY(2) TO SECOND(3));
    
  5. 作成したテーブルにステージングされたファイルをロードするには、:doc:`/sql-reference/sql/copy-into-table`コマンドを使用します。

    COPY INTO sample_interval_values FROM @~/interval_stage;
    
  6. ロードされたデータを表示するには、テーブルをクエリし、VARCHAR型にキャストしてロードされたデータを表示します。

    SELECT c1,
           c2::VARCHAR AS YEAR_TO_MONTH,
           c3::VARCHAR AS DAY_TO_SECOND,
      FROM sample_interval_values;
    
    +----+---------------+------------------+
    | C1 | YEAR_TO_MONTH | DAY_TO_SECOND    |
    |----+---------------+------------------|
    | 1  | +1-02         | +28 16:15:14.000 |
    | 2  | -3-02         | -54 16:15:14.123 |
    +----+---------------+------------------+
    

インターバルデータ型の制限

インターバルデータ型には、次の制限が適用されます。

  • 年月間隔値は、日時間隔値と組み合わせたり比較したりできません。

  • :ref:`インターバル定数<label-interval_constants>`とインターバルデータ型の値は、組み合わせたり比較したりできません。

  • インターバル定数は、インターバルデータ型を持つ列に挿入できません。

  • :ref:`label-data_type_variant`値に間隔値を含めることはできません。

  • :doc:`構造化データ型</sql-reference/data-types-structured>`の値に間隔値を含めることはできません。

  • 間隔式は、:doc:`ユーザー定義関数(UDFs)</developer-guide/udf/udf-overview>`や:doc:`Snowflakeスクリプト</developer-guide/snowflake-scripting/index>`で使用できません。

  • 次の型のテーブルには間隔列を含めることができません。

  • 間隔列に対するクエリは、:doc:`/user-guide/search-optimization-service`の恩恵を受けられません。

TIME

Snowflakeは、時刻を HH:MI:SS の形式で保存するための単一の TIME データ型をサポートしています。

TIME は、小数秒のオプションの精度パラメーター(例: TIME(3))をサポートします。時間精度の範囲は、0(秒)から9(ナノ秒)までです。デフォルトの精度は9です。

すべての TIME 値は、 00:00:0023:59:59.999999999 の間でなければなりません。TIME は「wallclock」時間を内部的に保存し、 TIME 値に対するすべての操作はタイムゾーンを考慮せずに実行されます。

TIMESTAMP_LTZ , TIMESTAMP_NTZ , TIMESTAMP_TZ

Snowflakeは、3種類のタイムスタンプをサポートしています。

TIMESTAMP_LTZ:

TIMESTAMP_LTZ は、 UTC の値を指定された精度で内部に保存します。ただし、すべての操作は、 TIMEZONE セッションパラメーターによって制御される現在のセッションのタイムゾーンで実行されます。

次のものは、 TIMESTAMP_LTZ と同義です。

  • TIMESTAMPLTZ

  • TIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP_NTZ:

TIMESTAMP_NTZ は、「wallclock」時間を指定された精度で内部に保存します。すべての操作は、タイムゾーンを考慮せずに実行されます。

出力形式にタイムゾーンが含まれる場合、 UTC インジケーター(Z)が表示されます。

TIMESTAMP_NTZ は、 TIMESTAMP のデフォルトです。

次のものは、 TIMESTAMP_NTZ と同義です。

  • TIMESTAMPNTZ

  • TIMESTAMP WITHOUT TIME ZONE

  • DATETIME

TIMESTAMP_TZ:

TIMESTAMP_TZ は、 UTC の値と、関連する*タイムゾーンオフセット*を内部的に保存します。タイムゾーンが提供されない場合は、セッションタイムゾーンオフセットが使用されます。すべての操作は、各レコードに固有のタイムゾーンオフセットで実行されます。

次のものは、 TIMESTAMP_TZ と同義です。

  • TIMESTAMPTZ

  • TIMESTAMP WITH TIME ZONE

TIMESTAMP_TZ 値は、 UTC の時間に基づいて比較されます。たとえば、次の異なるタイムゾーンの異なる時間の比較では、2つの値の UTC 時間が等しいため、 TRUE が返されます。

SELECT '2024-01-01 00:00:00 +0000'::TIMESTAMP_TZ = '2024-01-01 01:00:00 +0100'::TIMESTAMP_TZ;

注意

TIMESTAMP_TZ では、現在特定の値の作成時に、実際の タイムゾーン ではなく、特定のタイムゾーンの オフセット のみが保存されます。これは、 UTC で使用されない夏時間を扱う際に注意することが特に重要です。

たとえば、 TIMEZONE パラメーターを "America/Los_Angeles" に設定して、特定の年の1月に値を TIMESTAMP_TZ に変換すると、タイムゾーンオフセット -0800 が保存されます。後で値に6か月が追加されると、7月にロサンゼルスのオフセットが -0700 であっても、 -0800 オフセットが保持されます。これは、値が作成された後、実際のタイムゾーン情報("America/Los_Angeles")が利用できなくなるためです。次のコードサンプルは、この動作を示しています。

SELECT '2024-01-01 12:00:00'::TIMESTAMP_TZ;
+-------------------------------------+
| '2024-01-01 12:00:00'::TIMESTAMP_TZ |
|-------------------------------------|
| 2024-01-01 12:00:00.000 -0800       |
+-------------------------------------+
SELECT DATEADD(MONTH, 6, '2024-01-01 12:00:00'::TIMESTAMP_TZ);
+--------------------------------------------------------+
| DATEADD(MONTH, 6, '2024-01-01 12:00:00'::TIMESTAMP_TZ) |
|--------------------------------------------------------|
| 2024-07-01 12:00:00.000 -0800                          |
+--------------------------------------------------------+

TIMESTAMP

Snowflake内の TIMESTAMP は、 TIMESTAMP_* バリエーションの1つに関連付けられたユーザー指定のエイリアスです。TIMESTAMP が使用されるすべての操作では、関連する TIMESTAMP_* バリエーションが自動的に使用されます。TIMESTAMP データ型はテーブルに保存されません。

TIMESTAMP に関連付けられている TIMESTAMP_* バリエーションは、 TIMESTAMP_TYPE_MAPPING セッションパラメーターで指定されます。デフォルトは TIMESTAMP_NTZ です。

すべてのタイムスタンプのバリエーションと TIMESTAMP エイリアスは、小数秒のオプションの精度パラメーターをサポートします(例: TIMESTAMP(3))。タイムスタンプの精度は、0(秒)から9(ナノ秒)の範囲です。デフォルトの精度は9です。

タイムスタンプの例

これらの例では、異なるタイムスタンプを使ってテーブルを作成しています。

まず、 TIMESTAMP 列(TIMESTAMP_NTZ にマップされる)を持つテーブルを作成します。

ALTER SESSION SET TIMESTAMP_TYPE_MAPPING = TIMESTAMP_NTZ;

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP);

DESC TABLE ts_test;
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| TS   | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

次に、 TIMESTAMP バリエーション(TIMESTAMP_LTZ)のいずれかを明示的に使用します。

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_LTZ);

DESC TABLE ts_test;
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| TS   | TIMESTAMP_LTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

異なるタイムゾーンで TIMESTAMP_LTZ を使用します。

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_LTZ);

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';

INSERT INTO ts_test VALUES('2024-01-01 16:00:00');
INSERT INTO ts_test VALUES('2024-01-02 16:00:00 +00:00');

このクエリでは、1月2日のロサンゼルスの時刻は08:00(UTC では16:00)です。

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 16:00:00.000 -0800 |       16 |
| 2024-01-02 08:00:00.000 -0800 |        8 |
+-------------------------------+----------+

次に、タイムゾーンが異なると時間が変わることに注意します。

ALTER SESSION SET TIMEZONE = 'America/New_York';

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 19:00:00.000 -0500 |       19 |
| 2024-01-02 11:00:00.000 -0500 |       11 |
+-------------------------------+----------+

テーブルを作成して TIMESTAMP_NTZ を使用します。

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_NTZ);

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';

INSERT INTO ts_test VALUES('2024-01-01 16:00:00');
INSERT INTO ts_test VALUES('2024-01-02 16:00:00 +00:00');

異なるタイムゾーンの時刻は、どちらも同じ「壁時計」の時刻に変換されることに注意してください。

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------+----------+
| TS                      | HOUR(TS) |
|-------------------------+----------|
| 2024-01-01 16:00:00.000 |       16 |
| 2024-01-02 16:00:00.000 |       16 |
+-------------------------+----------+

次に、セッションのタイムゾーンを変更しても、結果には影響しないことに注意してください。

ALTER SESSION SET TIMEZONE = 'America/New_York';

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------+----------+
| TS                      | HOUR(TS) |
|-------------------------+----------|
| 2024-01-01 16:00:00.000 |       16 |
| 2024-01-02 16:00:00.000 |       16 |
+-------------------------+----------+

テーブルを作成して TIMESTAMP_TZ を使用します。

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_TZ);

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';

INSERT INTO ts_test VALUES('2024-01-01 16:00:00');
INSERT INTO ts_test VALUES('2024-01-02 16:00:00 +00:00');

なお、1月1日の記録はセッションのタイムゾーンを継承し、 America/Los_Angeles は数値のタイムゾーンオフセットに変換されました。

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 16:00:00.000 -0800 |       16 |
| 2024-01-02 16:00:00.000 +0000 |       16 |
+-------------------------------+----------+

次に、セッションのタイムゾーンを変更しても、結果には影響しないことに注意してください。

ALTER SESSION SET TIMEZONE = 'America/New_York';

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 16:00:00.000 -0800 |       16 |
| 2024-01-02 16:00:00.000 +0000 |       16 |
+-------------------------------+----------+

サポートされているカレンダー

Snowflakeは、すべての日付とタイムスタンプにグレゴリオ暦を使用します。グレゴリオ暦は1582年に始まりますが、Snowflakeはユリウス暦と一致するように1582年以前の日付(または1582年以前の日付を含む計算)を 調整しない ため、前の年を認識します。UUUU 形式要素は負の年をサポートしています。

日付と時刻の形式

これらのデータ型はすべて、最も妥当であり曖昧でない日付、時刻、または日付と時刻の形式を受け入れます。自動的に形式を検出するように構成されている 場合に、Snowflakeが認識する形式については、 AUTO 検出でサポートされている形式 をご参照ください。

日付と時刻の形式を手動で指定する こともできます。形式を指定するときは、次のテーブルに示す大文字と小文字を区別しない要素を使用できます。

形式要素

説明

YYYY

4桁の [1] 年。

YY

2桁の [1] 年で、TWO_DIGIT_CENTURY_START セッションパラメーターで制御されます。たとえば 1980 に設定すると、7980 の値は、それぞれ 20791980 として解析されます。

Y

先頭にゼロがない1桁または2桁 [2] の年。:ref:`label-TWO_DIGIT_CENTURY_START`セッションパラメーターによって制御されます。たとえば、パラメーターを:code:`1990`に設定すると、:code:`2005`と:code:`1991`の値は、それぞれ:code:`5`と:code:`91`としてシリアル化されます。

MM

2桁の [1] 月(:code:`01`= Januaryなど)。

MO

先頭にゼロがない1桁または2桁の [2] 月(1 = 1月など)。

MON

月の略称 [3]

MMMM

完全な月名 [3]

DD

月の2桁の [1] の日(0131)。

D

先頭にゼロがない1桁または2桁の [2] 月の日付(1``~``31)。

DY

曜日の略称。

HH24

時間を表す2桁の [1] 数字(0023)。AM / PM または A / P は指定*できません*。

HH12

時間を表す2桁の [1] 数字(0112)。AM / PM または A / P を指定できます。

H24

時間を表す先頭にゼロがない1桁または2桁の [2] 数字(0``~``23)。AM / PM または A / P は指定*できません*。

H12

時間を表す先頭にゼロがない1桁または2桁の [2] 数字(1``~``12)。AM / PM または A / P を指定できます。

AMPM

午前(AM)/午後(PM)。これは、:code:`HH12`およびcode:`H12`とのみ使用します(:code:`HH24`または:code:`H24`とは使用しま*せん*)。

P

午前(A)/午後(P)。これは、:code:`HH12`およびcode:`H12`とのみ使用します(:code:`HH24`または:code:`H24`とは使用しま*せん*)。

HH

:code:`HH24`の同義語。

H

:code:`H24`の同義語。

MI

分を表す2桁の [1] 数字(0059)。

ME

分を表す先頭にゼロがない1桁または2桁の [2] 数字(0``~``59)。

SS

秒を表す2桁の [1] 数字(0059)。

S

秒を表す先頭にゼロがない1桁または2桁の [2] 数字(0``~``59)。

FF[0-9]

0 (秒)から 9 (ナノ秒)の精度を持つ端数秒。例: FFFF0FF3FF9FF を指定することは、 FF9 (ナノ秒)と同等です。

TZH:TZMTZHTZMTZH

タイムゾーンの2桁の [1] 時間と分、UTC との時差。記号として +/- を付けることができます。

UUUU

ISO 形式 の4桁の年。これは BCE 年の場合は負になります。

[1] 桁数は、値をテキストにシリアル化するときに生成される出力を説明します。テキストを解析する場合、Snowflakeは指定された桁数まで受け入れます。たとえば、日を表す数字は1桁または2桁にすることができます。

:sub:`[2] 桁数は、値をテキストにシリアル化するときに生成される出力を説明します。解析はサポートされていません。解析が必要な場合は、先頭にゼロを含む同等の形式を使用してください。これらの形式要素はBCRバンドル2026_03`で有効になります。

:sub:`[3] MON 形式要素の場合、値をテキストにシリアル化するときに生成される出力は、短縮された月名です。MMMM 形式要素の場合、値をテキストにシリアル化するときに生成される出力は、完全な月名です。テキストを解析するとき、Snowflakeは MON と MMMM 両方について3桁の略称または完全な月名を受け入れます。たとえば、「January」または「Jan」、「February」または「Feb」などが、テキストを解析するときに受け入れられます。 `

注釈

  • 日付のみの形式を使用する場合、関連付けられた時刻はその日の午前0時と見なされます。

  • 二重引用符で囲まれた形式または上記の要素以外の形式のものは、解釈されることなく解析/フォーマットされます。Snowflakeは、リテラル文字がリテラルとして扱われるように、常に二重引用符で囲むこと(たとえば、"T""EST""Z")をお勧めします。

  • 有効な範囲、桁数、ベストプラクティスの詳細については、 日付、時刻、およびタイムスタンプ形式の使用に関する追加情報 をご参照ください。

日付と時刻形式の使用例

次の例では、「 FF 」を使用して、出力の小数秒フィールドに9桁を含める必要があることを示しています。

CREATE OR REPLACE TABLE timestamp_demo_table(
  tstmp TIMESTAMP,
  tstmp_tz TIMESTAMP_TZ,
  tstmp_ntz TIMESTAMP_NTZ,
  tstmp_ltz TIMESTAMP_LTZ);
INSERT INTO timestamp_demo_table (tstmp, tstmp_tz, tstmp_ntz, tstmp_ltz) VALUES (
  '2024-03-12 01:02:03.123456789',
  '2024-03-12 01:02:03.123456789',
  '2024-03-12 01:02:03.123456789',
  '2024-03-12 01:02:03.123456789');
ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET TIMESTAMP_TZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET TIMESTAMP_LTZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
SELECT tstmp, tstmp_tz, tstmp_ntz, tstmp_ltz
  FROM timestamp_demo_table;
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| TSTMP                         | TSTMP_TZ                      | TSTMP_NTZ                     | TSTMP_LTZ                     |
|-------------------------------+-------------------------------+-------------------------------+-------------------------------|
| 2024-03-12 01:02:03.123456789 | 2024-03-12 01:02:03.123456789 | 2024-03-12 01:02:03.123456789 | 2024-03-12 01:02:03.123456789 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+

日付と時刻の定数

定数 (別名 リテラル)は、固定データ値を指します。Snowflakeは、文字列定数を使用した固定の日付、時刻、またはタイムスタンプ値の指定をサポートしています。文字列定数は常に区切り文字で囲む必要があります。Snowflakeは、単一引用符を使用した文字列定数区切りをサポートしています。

例:

DATE '2024-08-14'
TIME '10:03:56'
TIMESTAMP '2024-08-15 10:59:43'

文字列は、次のパラメーターで設定されたデータ型の入力形式に基づいて、 DATE、 TIME、または TIMESTAMP の値として解析されます。

DATE:

DATE_INPUT_FORMAT

TIME:

TIME_INPUT_FORMAT

TIMESTAMP:

TIMESTAMP_INPUT_FORMAT

例:テーブルの列に特定の日付を挿入します。

CREATE TABLE t1 (d1 DATE);

INSERT INTO t1 (d1) VALUES (DATE '2024-08-15');

間隔定数

間隔定数を使用して、日付、時刻、またはタイムスタンプに期間を追加または削除できます。間隔定数は、次の構文を持つ INTERVAL キーワードを使用して実装されます。

{ + | - } INTERVAL '<integer> [ <date_time_part> ] [ , <integer> [ <date_time_part> ] ... ]'

すべての文字列定数と同様に、Snowflakeでは間隔定数を区切るために一重引用符が必要です。

注釈

間隔定数は日付と時刻の演算をサポートしますが、列型としての間隔ストレージはサポートしません。列に間隔値を格納するには、:ref:`インターバルデータ型<label-datatypes_interval_variations>`を使用します。

INTERVALキーワードは、1つ以上の整数、およびオプションで1つ以上の日付または時刻の要素をサポートします。例:

  • INTERVAL '1 year' は、1年を表します。

  • INTERVAL '4 years, 5 months, 3 hours' は4年5カ月と3時間を表しています。

日付または時刻の部分が指定されていない場合、間隔は秒を表します(例: INTERVAL '2'INTERVAL '2 seconds' と同一)。これは、日付演算を実行するためのデフォルトの時間単位とは異なります。詳細については、 日付の単純な演算 をご参照ください。

サポートされている日付と時刻部分のリストについては、このトピック内の サポートされている間隔の日付と時刻部分 をご参照ください。

注釈

  • 間隔の増分の順序は重要です。増分は、リストされている順序で加算または減算されます。例:

    • INTERVAL '1 year, 1 day' 最初に1年、次に1日を加算/減算します。

    • INTERVAL '1 day, 1 year' 最初に1日、次に1年を加算/減算します。

    これは、うるう年などのカレンダーイベントの計算に影響を与える可能性があります。

    SELECT TO_DATE ('2019-02-28') + INTERVAL '1 day, 1 year';
    
    +---------------------------------------------------+
    | TO_DATE ('2019-02-28') + INTERVAL '1 DAY, 1 YEAR' |
    |---------------------------------------------------|
    | 2020-03-01                                        |
    +---------------------------------------------------+
    
    SELECT TO_DATE ('2019-02-28') + INTERVAL '1 year, 1 day';
    
    +---------------------------------------------------+
    | TO_DATE ('2019-02-28') + INTERVAL '1 YEAR, 1 DAY' |
    |---------------------------------------------------|
    | 2020-02-29                                        |
    +---------------------------------------------------+
    
  • INTERVAL は、データ型ではありません(テーブル列をデータ型 INTERVAL として定義することはできません)。間隔は、日付、時刻、タイムスタンプの計算でのみ使用できます。

  • SQL 変数 で区間を使うことはできません。例えば、次のクエリはエラーを返します。

    SET v1 = '1 year';
    
    SELECT TO_DATE('2023-04-15') + INTERVAL $v1;
    

サポートされている間隔の日付と時刻部分

INTERVAL キーワードは、次の日付と時刻部分を引数としてサポートします(大文字と小文字の区別なし)。

日付または時刻部分

略語/バリエーション

year

yyyyyyyyyyyryearsyrs

quarter

qqtrqtrsquarters

month

mmmonmonsmonths

week

wwkweekofyearwoywyweeks

day

ddddaysdayofmonth

hour

hhhhrhourshrs

minute

mmiminminutesmins

second

ssecsecondssecs

millisecond

msmsecmilliseconds

microsecond

ususecmicroseconds

nanosecond

nsnsecnanosecnsecondnanosecondsnanosecsnseconds

間隔の例

特定の日付に年間隔を追加します。

SELECT TO_DATE('2023-04-15') + INTERVAL '1 year';
+-------------------------------------------+
| TO_DATE('2023-04-15') + INTERVAL '1 YEAR' |
|-------------------------------------------|
| 2024-04-15                                |
+-------------------------------------------+

特定の時間に3時間18分のインターバルを追加します。

SELECT TO_TIME('04:15:29') + INTERVAL '3 hours, 18 minutes';
+------------------------------------------------------+
| TO_TIME('04:15:29') + INTERVAL '3 HOURS, 18 MINUTES' |
|------------------------------------------------------|
| 07:33:29                                             |
+------------------------------------------------------+

CURRENT_TIMESTAMP 関数の出力に複雑な間隔を追加します。

SELECT CURRENT_TIMESTAMP + INTERVAL
    '1 year, 3 quarters, 4 months, 5 weeks, 6 days, 7 minutes, 8 seconds,
    1000 milliseconds, 4000000 microseconds, 5000000001 nanoseconds'
  AS complex_interval1;

以下はサンプル出力です。現在のタイムスタンプが異なる場合は出力が異なります。

+-------------------------------+
| COMPLEX_INTERVAL1             |
|-------------------------------|
| 2026-11-07 18:07:19.875000001 |
+-------------------------------+

特定の日付に、略称の日付/時刻の部分表記を使用した複雑な間隔を追加します。

SELECT TO_DATE('2025-01-17') + INTERVAL
    '1 y, 3 q, 4 mm, 5 w, 6 d, 7 h, 9 m, 8 s,
    1000 ms, 445343232 us, 898498273498 ns'
  AS complex_interval2;
+-------------------------------+
| COMPLEX_INTERVAL2             |
|-------------------------------|
| 2027-03-30 07:31:32.841505498 |
+-------------------------------+

従業員情報のテーブルをクエリし、過去2年と3か月以内に雇用された従業員の名前を返します。

SELECT name, hire_date
  FROM employees
  WHERE hire_date > CURRENT_DATE - INTERVAL '2 y, 3 month';

t1 という名前のテーブルから ts という名前の TIMESTAMP 列をフィルターし、各戻り値に4秒を追加します。

SELECT ts + INTERVAL '4 seconds'
  FROM t1
  WHERE ts > TO_TIMESTAMP('2024-04-05 01:02:03');

日付の単純な演算

日付、時刻、タイムスタンプの加減算に区間定数を使うことに加えて、 DATE 値に { + | - } integer の形式で日数を加減算することもできます。ここで、 integer は加減算する日数を指定します。

注釈

TIME と TIMESTAMP 値はまだ単純な演算をサポートしていません。

日付演算の例

指定した日付に1日を追加します。

SELECT TO_DATE('2024-04-15') + 1;
+---------------------------+
| TO_DATE('2024-04-15') + 1 |
|---------------------------|
| 2024-04-16                |
+---------------------------+

特定の日付から4日引きます。

SELECT TO_DATE('2024-04-15') - 4;
+---------------------------+
| TO_DATE('2024-04-15') - 4 |
|---------------------------|
| 2024-04-11                |
+---------------------------+

employees という名前のテーブルをクエリし、365日以上雇用された退職者の名前を返します。

SELECT name
  FROM employees
  WHERE end_date > start_date + 365;