あなたの知らないタイムスタンプの世界

465 Views

July 28, 26

スライド概要

Microsoft Data Analytics Day(Online) 勉強会 2026/07_発表資料
ユーザーグループ: https://sqlserver.connpass.com/
Qiita: https://qiita.com/satoshi_enomoto

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

Microsoft Data Analytics Day (Online) 勉強会 あなたの知らないタイムスタンプの世界 発表者:Satoshi Enomoto 2026/07/28

2.

はじめに • • 日時は一見単純に見えるが、以下が絡むため問題になることがある ✓ タイムゾーン 地域によって時刻の基準が異なる ✓ UTC / JST 同じ時間でも表示が変わる ✓ サマータイム 夏と冬で時刻のオフセットが変わる ✓ セッション設定 システムやユーザーの設定で解釈が変わる ✓ 型の違い TIMESTAMP の種類によって保持する情報が異なる システムごとの TIMESTAMP 型の特徴を理解しておかないと連携・移行時に問題が発生する Databricks TIMESTAMP (LTZ) TIMESTAMP_NTZ Snowflake TIMESTAMP_NTZ TIMESTAMP_LTZ TIMESTAMP_TZ Fabric datetime2 datetimeoffset 2

3.

Databricks の TIMESTAMP • Databricks (Spark) には TIMESTAMP 型が2種類存在する TIMESTAMP (LTZ) TIMESTAMP_NTZ UTC に正規化して保存し、 表示時にセッションタイムゾーンを適用 タイムゾーン情報を持たない時刻 保存される値のイメージ 2026-01-01 03:00:00 (UTC として保存) 2026-01-01 12:00:00 (タイムゾーンなし) 表示(SELECT 時) ※セッションタイムゾーン: Asia/Tokyo 2026-01-01 12:00:00 (UTC → JST に変換) 2026-01-01 12:00:00 (変わらない) 特徴 用途のイメージ • • グローバルなイベント時刻の記録 ユーザのタイムゾーンに合わせて表示したい 場合 • • 特定のタイムゾーンに依存しない時刻 他システムとの時刻一致を重視する場合 3

4.

Databricks の TIMESTAMP • TIMESTAMP, TIMESTAMP_NTZ の各カラムに `2026-01-01 12:00:00 +09:00` の文字列を挿入し、 SELECTした結果 ✓ セッションタイムゾーンを `UTC` とした場合 ✓ セッションタイムゾーンを `Asia/Tokyo` とした場合 4

5.

Databricks の TIMESTAMP • TIMESTAMP および TIMESTAMP_NTZ の最大精度は6桁 ✓ TIMESTAMP TIMESTAMP 型 - Azure Databricks - Databricks SQL | Microsoft Learn ✓ TIMESTAMP_NTZ TIMESTAMP_NTZ 型 - Azure Databricks - Databricks SQL | Microsoft Learn 5

6.

Databricks の TIMESTAMP • TIMESTAMP および TIMESTAMP_NTZ の最大精度は6桁 ✓ 6桁以上を挿入しても、保持されていない 6

7.

Snowflake の TIMESTAMP • Snowflake には TIMESTAMP 型が3種類存在する TIMESTAMP_NTZ TIMESTAMP_LTZ TIMESTAMP_TZ タイムゾーン情報を持たない時刻 UTC に正規化して保存し、 表示時にセッションタイムゾーンを適用 時刻とタイムゾーン(オフセット)を保持 保存される値のイメージ 2026-01-01 12:00:00 (タイムゾーンなし) 2026-01-01 03:00:00 (UTC として保存) 2026-01-01 12:00:00 +0900 (タイムゾーンを保持) 表示(SELECT 時) ※セッションタイムゾーン: Asia/Tokyo 2026-01-01 12:00:00 (変わらない) 2026-01-01 12:00:00 (UTC → JST に変換) 2026-01-01 12:00:00 +0900 (タイムゾーンを維持) 特徴 • 用途のイメージ 備考 • • • 特定のタイムゾーンに依存しない 時刻 他システムとの時刻一致を重視 する場合 • • グローバルなイベント時刻の記録 ユーザのタイムゾーンに合わせて表示 したい場合 • タイムゾーンそのものが重要な場合 TIMESTAMP 型のデフォルトは NTZ となる DATETIME は NTZ と同義 7

8.

Snowflake の TIMESTAMP • TIMESTAMP_NTZ, TIMESTAMP_LTZ, TIMESTAMP_TZ, TIMESTAMP, DATETIME の各カラムに `2026-01-01 12:00:00 +09:00` の文字列を挿入し、 SELECTした結果 ✓ セッションタイムゾーンを `UTC` とした場合 ✓ セッションタイムゾーンを `Asia/Tokyo` とした場合 8

9.

Snowflake マネージド Iceberg テーブルの TIMESTAMP • Snowflake マネージド Iceberg テーブルは TIMESTAMP_NTZ (timestamp) と TIMESTAMP_LTZ (timestamptz) をサポートしているが、 Snowflake テーブルとデフォルトの精度が異なる ✓ Snowflake テーブルのデフォルトの精度は9、一方で Iceberg テーブルのデフォルトの精度は6 日付と時刻のデータ型 | Snowflake Documentation Apache Iceberg テーブルのデータ型 | Snowflake Documentation 9

10.

Snowflake マネージド Iceberg テーブルの TIMESTAMP • Snowflake マネージド Iceberg テーブルは TIMESTAMP_NTZ (timestamp) と TIMESTAMP_LTZ (timestamptz) をサポートしているが、 Snowflake テーブルとデフォルトの精度が異なる ✓ Snowflake テーブルの挙動 ✓ Iceberg テーブルの挙動 10

11.

Snowflake マネージド Iceberg テーブルの TIMESTAMP • ただし、Snowflake マネージド Iceberg テーブルで v3 (プレビュー)を利用する場合、ナノ秒精度をサポートする ✓ Iceberg v3 の場合、TIMESTAMP_NTZ(9), TIMESTAMP_LTZ(9) をサポートする Apache Iceberg テーブルのデータ型 | Snowflake Documentation 11

12.

Snowflake マネージド Iceberg テーブルの TIMESTAMP • ただし、Snowflake マネージド Iceberg テーブルで v3 (プレビュー)を利用する場合、ナノ秒精度をサポートする ✓ 明示的に桁数を指定することでナノ秒精度まで保持することが可能 12

13.

Databricks マネージド Iceberg テーブルの TIMESTAMP • 一方、Databricks マネージド Iceberg テーブル v3 はナノ秒精度をサポートしていない ✓ 制限事項として記載あり Apache Iceberg v3 の機能を使用する - Azure Databricks | Microsoft Learn 13

14.

Databricks マネージド Iceberg テーブルの TIMESTAMP • 一方、Databricks マネージド Iceberg テーブル v3 はナノ秒精度をサポートしていない ✓ TIMESTAMP / TIMESTAMP_NTZ どちらも6桁までしか保持しない 14

15.

Fabric の TIMESTAMP について • ウェアハウス(T-SQL)では datetime2 になり、レイクハウスでは Databricks (Spark) と同様の挙動となる ✓ ウェアハウス ➢ ➢ ➢ TIMESTAMP_NTZ については、ショートカットやミラーリングの際に制約がある可能性 あり Microsoft Fabric において TIMESTAMP_NTZ 型カラムを含むテーブルで メタデータ仮想化が失敗する事象 #Snowflake – Qiita 解決:Re: ミラーされたAzure Databricksカタログが欠落しています...Microsoft Fabricコミュニティ ✓ レイクハウス OneLake で Iceberg テーブルを使用する - Microsoft Fabric | Microsoft Learn 15

16.

システム間の連携で考慮すべき注意点 • 注意点1:タイムゾーンの解釈差異 Snowflake TIMESTAMP に日本時間として `2026-01-01 12:00:00`を保持 Databricks TIMESTAMP に保持すると `2026-01-01 12:00:00 +00:00`となる JST として運用 JST として運用すると +09:00 となってしまう ✓ TIMESTAMPのまま ±9時間するか、もしくは TIMESTAMP_NTZを検討する • 注意点2:精度の差異 Snowflake TIMESTAMP は9桁精度 `2026-01-01 12:00:00.123456789` Databricks TIMESTAMP は6桁精度のため桁落ちが発生 `2026-01-01 12:00:00.123456` ✓ ナノ秒まで重要な場合は文字列を検討する ✓ Snowflake で Iceberg v2 に変換する際にも同様の問題が発生する 16

17.

システム間の連携で考慮すべき注意点 • 注意点3:特定の条件下で、フィルタリングで指定する値のデータ型の差異により性能悪化が発生 ✓ 例:Databricks にて TIMESTAMP_NTZ 型のカラムに対して TIMESTAMP 型の値でフィルタリング Databricks DECLARE OR REPLACE VARIABLE var_ts_ltz TIMESTAMP; SET VAR var_ts_ltz = ( SELECT timestamp '1998-01-01T00:00:00.000’ ); SELECT * FROM cat_01.schema_01.table WHERE col_ts_ntz >= var_l_ship_ts_ltz TIMESTAMP_NTZ 型 ➢ ➢ TIMESTAMP 型 実際にプルーニングされない状況が発生するのはもっと複雑な条件となる 詳細はこちら:Databricks にて TIMESTAMP_NTZ 列を TIMESTAMP でフィルタしたら実行時間が約470倍になった話 ― データスキップが効かなくなる落 とし穴 #Databricks - Qiita 17

18.

ご清聴ありがとうございました!