◾️はじめに
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
Snowflake と PostgreSQL の違い
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