Memos About Salesforce

Salesforceにハマってたこと!

Salesforce SOQL 日付項目の条件と日付列の表示

こんにちは、管理人の@Salesforce.Zです。

調査や、個人開発時にSalesforceの開発者コンソルが便利かと思います。

今回、共有したいのが開発者コンソルで、日付項目を条件にするメモと日付項目をローカル日付にする方法です。

目次

開発者コンソルでSOQLに使う日付項目の扱い

SELECT Id, CreatedDate FROM Account

こんなクエリだけ、下記のようになります。

f:id:jude2016:20190214113934p:plain
クエリ結果

取引先の作成日(CreatedDate列)がまあ、画像通りの感じになります。

ぱっと見、協定世界時 (UTC)となり、わかりにくいので、

対象レコードを探す時に不便と思います。

そこで、format(datetime field)で解決になります。

SELECT Id, format(CreatedDate) FROM Account

f:id:jude2016:20190214130524p:plain
ローカル日付になるクエリ

日付リテラルでクエリ条件にする

対象データをクエリで絞って、変数に格納するのがよくある

条件に日付項目を使う場合、日付リテラルを使うと便利です。

SELECT Id
    , format(CreatedDate)
FROM Account
WHERE CreatedDate = LAST_90_DAYS
SELECT Id
    , format(CreatedDate)
FROM Account
WHERE CreatedDate > LAST_N_DAYS:365

いろいろ便利な日付リテラルが用意されています。

リテラル定数をメソッドの引数に渡す場合

下記data access object(略はDAO)があるとします

public with sharing class yourDaoClassName {
    /**
     * レコードのリストを取得
     * @param ids レコードIDのセット
     * @return List<sObject>(取得できなかった場合はEmpty)
     */
    public static List<Account> getThisMonthRecs(String thisMon_literals_str, String recdTypeDevname, String query_fields){
        String query = 'SELECT Id, Name';
        query += query_fields;
        query += ' FROM Account';
        query += ' WHERE date_field1__c  = ' + thisMon_literals_str;
        query += ' AND RecordType.DeveloperName = :recdTypeDevname';
        return Database.query(query);
    }
}

リテラル定数を上記のgetThisMonthRecsの引数に渡す

yourDaoClassName.getThisMonthRecs('THIS_MONTH', 'recordtypeDevName')

普段クエリに動的条件を変更する場合、引数名の前に「:」をつけて、変数として扱うがリテラル定数の場合

動的クエリの文字列外に

query += ' WHERE date_field1__c = ' + thisMon_literals_str;

こうすれば、引数として、自由自在にリテラル定数を設定可能になります。

リファレンス

日付リテラス

FORMAT()