Matabase Model/モデル機能使って、毎回のタイムゾーン変更を省略!
現在、海外向けサービスを開発しているため、DBに保存されている時刻をUTCで保存しています。
そのため、Metabaseを用いてデータを一覧する際に、UTC以外のタイムゾーンで表示したい場合、毎回変換が必要となります。JSTで表示したい場合もPST/PDTで表示したい時も場合もあり、毎回毎回変換するのがとても面倒です。
SELECT
timezone('Asia/Tokyo', created_at at time zone 'UTC') as created_at,
timezone('America/Los_Angeles', created_at at time zone 'UTC') as created_at,
*
FROM
users
このような面倒さをModel機能で解決できました!
Model / モデル機能
自分たちの好きなようにテーブルを再定義できる機能です。
質問または、SQLクエリで定義する事ができます。
今回のように、タイムゾーンを最適化したり、enumで定義している値を変換したり、よく使う値を計算させたり、自分たちの使いやすいようなテーブルを定義することができます。
使い方
モデル定義
サイドバーメニューからモデルの一覧を開き、右上から新規モデルの追加ができます。

作成方法を質問かSQLクエリか選択します。
今回はモデルの定義をSQLクエリで行いました。

クエリの書き方は通常と同じです。自分の表示したい形式にしたデータを定義します。
SELECT
-- 日本時間のcreated_atをcreated_at_japanとして再定義
timezone('Asia/Tokyo', created_at at time zone 'UTC') as created_at_japan,
-- アメリカ・ロサンゼルス時間のcreated_atをcreated_at_us_losとして再定義
timezone('America/Los_Angeles', created_at at time zone 'UTC') as created_at_us_los,
*
FROM
users
実行し、意図したデータになっているかを確認し、保存するだけです。

モデルを参照する
次に、クエリからモデルを参照してみます。
通常のクエリを書くときに、{{#xxxx}}という形で書くと存在するモデル(もしくは、クエリの結果)を参照することができます。
エディタ内で{{#}}内に文字を入力すると、候補としてモデル、クエリの名前が出てくるので、選択します。

最終的なクエリは以下です。
SELECT
*
FROM
{{#1012-test-user-model}}
実行すると、先程定義したデータを取得することができます。これで毎回のタイムゾーンの変換の手間から解放されました!

結合などは???
もちろん既存のテーブルと結合して参照することも可能です。基本的には、他のテーブルと同じような扱いができると思います。
SELECT
*
FROM
{{#1012-test-user-model}} as users
left outer join user_daily_accesses on users.id = user_daily_accesses.user_id
使い方案
今回はタイムゾーンの変換を事前にしておくために利用しましたが、以下のようなパターンにも利用できそうです。
-
enumの変換
-
時間の事前計算(秒->分など)
-
よく結合するテーブルの結合
Discussion