はじめに
Power Automate で日時データを Dataverse に登録する、または日時フィールドでクエリしてレコード(行)を取得するという処理を行うことがあります。今回の記事では、そこで Power Platform 初心者の私が勘違いしていた Dataverse の日時フィールドの仕様を備忘録として残しておきます。
ケース1:Dataverse に保存した日時データの時間が合わない
Power Automate で現在日時を取得する際、しばしば「アクション:現在の時刻」や「関数:utcNow」を使用しますが、これらはUTCであるため、JST(UTC+09:00)に変換した現在日時を Dataverse のテーブルに保存してみます。
実行結果:
UTCの現在日時「2024年4月16日9時14分」に対して、テーブルにはJSTに変換した日時「2024年4月16日18時14分」が入力されていることが確認できます。
テーブル画面:
しかし、Dataverse のテーブルを見てみると 「2024年4月17日3時14分」。取得したJSTよりさらに9時間進んだ日時になってしまいました。
ケース2:Dataverse の日時フィールドでクエリしても対象のレコードが取得できない
続いて、Power Automate を使用して先ほどのテーブルから「2024年4月17日0時以降」のレコードをクエリして取得してみます。
実行結果:
「2024年4月17日0時以降」であれば「2024年4月17日3時14分」のレコードが取得できるはずですが、何も取得できませんでした。
日時フィールドの仕様を確認してみる
公式のドキュメントを確認すると、dataverse はすべての日付と時刻の値をUTCで保存するとのことでした。
また、テーブルの日時フィールドにおいて、[タイムゾーンの調整] が [ユーザーローカル] に設定されている場合、日時フィールドはユーザーローカルのタイムゾーンとの差を自動で計算して表示します。一方、[タイムゾーン非依存] とすると、データベースに保存される日時と表示を一致させることができます。※デフォルトでは [ユーザローカル] に設定されています。
つまり、今回のケースでは、「2024年4月16日18時14分」をUTCとして保存しており、[ユーザローカル] の設定により9時間進んだ「2024年4月17日3時14分」が表示されていました。そのため、保存した日時と表示の日時が合わない、日時でクエリしたデータがうまく取得できないという事象が発生しているのでした。[ユーザローカル] で使用する場合は、データの保存もクエリもUTCの日時で行う必要があるということです。
結論
- Dataverse の日時フィールドは、内部的にUTCの値を持っている。
- [タイムゾーン調整] を [ユーザローカル] に設定することで、表示される日時がユーザローカルのタイムゾーンに変換される。
おわりに
一般的なデータベースは、異なるタイムゾーンの日時を一貫して管理するためにUTCを使用しています。また、多くのグローバルなサービスや外部システムもUTCを使用しているため、それらとのデータの統合や連携を行う際にもUTCタイムゾーンで管理しておくとスムーズです。初歩的な内容ではありますが、私を含め Power Platform をきっかけにアプリ開発やデータベースにはじめて触れる方もいらっしゃると思うので記事として残しました。