【Snowflake】Snowflake と PostgreSQL の違い 〜 SQL / 日時 〜

◾️はじめに

https://dk521123.hatenablog.com/entry/2024/09/28/212432

で、Snowflake と PostgreSQL の違いについて扱った。
その際に、Local開発環境はPostgreSQLで
本番環境はSnowflakeで
DB(DWH)間には、DBTで吸収していると書いたのだが
できれば、DBTマクロを使わずに差異がないようにSQLを書くようにしている。
その際に日時系(DATE/DATETIME/TIMESTAMP)のTipsに関して、メモしておく

目次

【0】Tips
 1)変換についてはキャストを使うとSQLの差異が緩和される
【1】日時系の関数に関する差異
 1)日時フォーマット指定が必須か否か
 2)TRY_TO_XXX はSnowflakeのみ
【2】日時系のデータ型に関する差異
 1)Snowflakeはタイムスタンプ型の種類多し

【0】Tips

1)変換についてはキャストを使うとSQLの差異が緩和される

* TO_DATEなどの関数で変換しようとした場合、
 PostgreSQLでは変換するためのフォーマット(YYYY-MM-DD的な)が必要だが、
 Snowflakeではオプションでなくても動く。
 => ただ、SELECT demo_date_str::DATE ならどっちも動く

【1】日時系の関数に関する差異

1)日時フォーマット指定が必須か否か

PostgreSQLでは変換するためのフォーマット(YYYY-MM-DD的な)が必要だが、
Snowflakeではオプションでなくても動く

PostgreSQL
https://www.postgresql.jp/docs/9.4/functions-formatting.html

-- 文字列を日付に変換
to_date(text, text) -- e.g. TO_DATE('20170103','YYYYMMDD')
-- 文字列をタイムスタンプに変換
to_timestamp(text, text) -- e.g. to_timestamp('05 Dec 2000', 'DD Mon YYYY')

Snowflake
https://docs.snowflake.com/ja/sql-reference/functions/to_date

TO_DATE( <string_expr> [, <format> ] ) -- <format>がオプション
TO_DATE( <timestamp_expr> )
TO_DATE( '<integer>' )
TO_DATE( <variant_expr> )

https://docs.snowflake.com/ja/sql-reference/functions/to_timestamp

timestampFunction ( <numeric_expr> [ , <scale> ] )
timestampFunction ( <date_expr> )
timestampFunction ( <timestamp_expr> )
timestampFunction ( <string_expr> [ , <format> ] ) -- <format>がオプション
timestampFunction ( '<integer>' )
timestampFunction ( <variant_expr> )

2)TRY_TO_XXX はSnowflakeのみ

* TRY_TO_DATE / TRY_TO_TIMESTAMP などのTRY_TO_XXX はSnowflakeのみで
 PostgreSQLでは未サポート

https://docs.snowflake.com/ja/sql-reference/functions/try_to_date
https://docs.snowflake.com/ja/sql-reference/functions/try_to_timestamp

【2】日時系のデータ型に関する差異

項目 Snowflake PostgreSQL
日付型 DATE date
時刻型 TIME time
タイムスタンプ型 TIMESTAMP etc timestamp
時間間隔 - interval
* ドキュメントについては、以下を参照の事

Snowflake
https://docs.snowflake.com/ja/sql-reference/data-types-datetime
PostgreSQL
https://www.postgresql.jp/docs/9.4/datatype-datetime.html

1)Snowflakeはタイムスタンプ型の種類多し

* 上の表以外でも、Snowflakeには以下のタイムスタンプ型がサポート。
 + TIMESTAMP_LTZ
 + TIMESTAMP_NTZ(DATETIME)
 + TIMESTAMP_TZ

https://dk521123.hatenablog.com/entry/2021/12/16/095524

より抜粋

DATETIME

* TIMESTAMP_NTZのエイリアス

TIMESTAMP

* TIMESTAMP_* バリエーションの1つに関連付けられたユーザー指定のエイリアス
* デフォルトは TIMESTAMP_NTZ

TIMESTAMP_LTZ

* UTC 時間を指定された精度で内部に保存
* LTZ = Local Time Zone

TIMESTAMP_NTZ

* 「wallclock」時間を指定された精度で内部に保存
* タイムゾーンのないタイムスタンプ (NTZ = Not Time Zone?)

TIMESTAMP_TZ

*  UTC 時間と関連する タイムゾーンオフセット を内部に保存

関連記事

Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ 基本編 / データ型 ~
https://dk521123.hatenablog.com/entry/2021/12/16/095524
Snowflake ~ 日時関連 ~
https://dk521123.hatenablog.com/entry/2022/06/17/113003
Snowflake ~ 日時関連 / 日時取得関数 ~
https://dk521123.hatenablog.com/entry/2022/09/02/092144
Snowflake ~ Timezone ~
https://dk521123.hatenablog.com/entry/2024/10/10/002436
Snowflake ~ 文字列操作関連 ~
https://dk521123.hatenablog.com/entry/2022/10/01/000000
SnowflakePostgreSQL の違い
https://dk521123.hatenablog.com/entry/2024/09/28/212432
PostgreSQL】COPY コマンド ~ COPY FROM / TO ~
https://dk521123.hatenablog.com/entry/2020/06/11/112650
Amazon Redshift ~ COPY コマンド ~
https://dk521123.hatenablog.com/entry/2021/07/21/214248
権限トラブル時のTips
https://dk521123.hatenablog.com/entry/2022/08/19/131922
Snowflake ~ GRANT OWNERSHIP ~
https://dk521123.hatenablog.com/entry/2022/02/25/094250
Snowflake ~ SHOW GRANTS ~
https://dk521123.hatenablog.com/entry/2022/10/25/213624
エラー「Insufficient privileges to operate」時の対応
https://dk521123.hatenablog.com/entry/2022/08/02/090439