SOQLの日付の絞り込みが上手くいかない、、
SOQLの日付の扱い方はSQLとは違います!
この記事を書いた人
- エンジニア歴4年のフリーランスデータエンジニア
- 高卒工場勤務からエンジニア転職
- 3年目でフリーランスになり年収1000万↑達成
- フルリモ歴2年、2児の育児中
今回は、SalesforceのSOQLと、SQLでの日付データの扱い方について、簡単にわかりやすく説明します!
本記事で取り扱うデータベースについて
- Account(取引先):企業や組織の情報。
- Contact(取引先責任者):Accountに関連する人物の情報。
- Order__C(注文):取引先に関連する注文情報。
SOQLとSQLの日付データの違い
それでは、SQLとSOQLが日付をどう扱うかの基本を見てみましょう!
1. 日付のフォーマット
SQLでは、日付を標準的なフォーマット(例えば YYYY-MM-DD
)で扱います。一方、SOQLでは、Salesforceのシステムが自動的にISO 8601形式の日付を使います。これは YYYY-MM-DDThh:mm:ss.sssZ
という形で、これは世界標準の時間表記です。
SQLの例
SELECT * FROM Order__C WHERE OrderDate = '2024-10-19';
SOQLの例
SELECT Id, OrderDate FROM Order__C WHERE OrderDate = 2024-10-19T00:00:00Z;
SQLではシンプルな日付フォーマットを使うことが多いですが、SOQLでは時間も含まれた詳細なフォーマットになります。
2. 日付リテラルの活用(SOQLの独自機能)
Salesforceには日付リテラルという便利な機能があります。まずはSQLでの指定方法から見ていきましょう。
SQLで過去30日間の注文を取得する場合
SELECT * FROM Order__C WHERE OrderDate >= CURDATE() - INTERVAL 30 DAY;
SQLでは演算を使って指定する必要があります。
SOQLで過去30日間の注文を取得する場合
SELECT Id, OrderDate FROM Order__C WHERE OrderDate = LAST_N_DAYS:30;
このように、SalesforceのSOQLでは日付リテラルを使用し、特定の時間範囲を簡単に指定できます。以下はSOQLで使える日付リテラルの例です。
TODAY
: 今日の日付YESTERDAY
: 昨日LAST_WEEK
: 先週NEXT_MONTH
: 来月LAST_N_DAYS:n
: 過去n日間NEXT_N_DAYS:n
: 今後n日間
SOQLの日付の時差とタイムゾーン
Salesforceでは、デフォルトでUTC(協定世界時)が使われます。これは、世界標準の時間であり、日本時間(JST)とは9時間の時差があります。
1. UTCからJST(日本時間)に合わせて日付を取得する方法
日付をJSTで扱いたい場合、SOQLではUTCから9時間足してデータを取得する必要があります。Salesforceでは、ユーザーのタイムゾーンに基づいて日付を自動的に調整してくれる機能もありますが、細かく指定する場合は時差を考慮した調整が必要です。
日付リテラルを使用し昨日のデータを取得する場合
以下のクエリは、UTCと日本時間の時差を考慮して設定する必要があります。
SELECT * FROM Order__C WHERE OrderDate >= '2024-10-18 15:00:00' AND OrderDate < '2024-10-19 15:00:00';
日付リテラルを使用し昨日のデータを取得する場合
以下のクエリは、Salesforceはユーザーのタイムゾーンを考慮してデータを自動的に調整します。
SELECT Id, OrderDate FROM Order__C WHERE OrderDate = YESTERDAY;
2. SOQLのタイムゾーン設定の重要性
SalesforceのSOQLクエリは、ユーザーのタイムゾーンに基づいてデータを返すため、特に時間を伴うクエリでは、タイムゾーンの設定が非常に重要です。クエリが実行されたタイミングや、ユーザーのタイムゾーンによって結果が異なることがあるため、正確なデータ取得には注意が必要です。
まとめ
SalesforceのSOQLとSQLは、日付の取り扱いにおいて多くの違いがあります。それぞれの違いを理解して使い分けることで、より効率的にデータを操作できます。
- 日付フォーマット:SOQLはISO 8601形式で時間も含まれます。
- 日付リテラル:SOQLでは便利な日付リテラルが使えます(例:TODAY, LAST_WEEK)。
- 時差の考慮:SOQLはUTCがデフォルトですが、Salesforceはユーザーのタイムゾーンを考慮します。
SOQLの独自ルールをしっかり理解し、Salesforceの日時取得を正確に行いましょう!