申請日時が3日前のものをフィルターで表示したい

U3D4
Tera Contributor

コミュニティの皆様

申請テーブルを作成し、申請日時(日付/時刻)フィールドの値が、

現在の日付の3日以前のものをフィルターして表示させようとしております。

 

申請日時が3日以前のレコードをいくつか用意し、

添付画像2のように、フィルターを設定してみたところ、

3日前の条件に当てはまるはずのものが、抽出されておりませんでした。

 

画像1.10/29の15:00に、3日前の10/26のレコードをいくつか用意

U3D4_0-1730185503423.png

 

画像2.フィルター条件を以下のように設定

U3D4_1-1730185636706.png

 

どうやら、10/29の15:00にフィルターした場合、

10/26の15:01以降は3日前として判定されないようです。

 

日付のみを見て3日前と判定してほしいのですが、

こちらをフィルターする方法がわかりません。

何か良い方法があれば、ご教示いただけますと幸いです。

1 件の受理された解決策

ユーザーのタイムゾーンとシステムのタイムゾーンを混同しないように注意してくださいね。
ユーザープリファレンス・ユーザー設定のタイムゾーンは自由に変えて問題ありません。ユーザーの必要なタイムゾーンしてください。

そして検索もユーザーのタイムゾーンに合わせて3日間を判定できるように作られています。
リストビューはユーザーのタイムゾーンで表示されています。

ServiceNowの内部は標準時間になっています。ユーザーのタイムゾーンから変換して検索してくれています。

私が紹介したScriptを使えば、ユーザーのタイムゾーン 日本時間で何日前なのかを処理できます。そのため、システムが標準時間であっても、この方法なら、日本時間の3日間の判定が正しく出来ます。
少し難しいですが日本時間に設定したユーザーと、別のタイムゾーンのユーザーでは、リストビューの時間が変わりますし、3日間の区切りの時間も変わります。ユーザーのタイムゾーンなのでそう言うものです。

Docs GlideSystem - グローバル

GlideSystem - daysAgoEnd(数値 days) 指定された日数前の 1 日の終わりの日時を返します。

GlideSystem - daysAgoStart(数値 days) 指定された日数前の 1 日の始まりの日時を返します。

 

Scriptは難しいと言うことであれば、7日の選択肢はあるので、3日よりは少々多いですが、運用的に許されるなら7日することが簡単です。

元の投稿で解決策を見る

14件の返信14

@U3D4 原因が分かったと思います。

ServiceNowはDateTimeをGMTタイムゾーンで登録しています。

自分のプロフィールからタイムゾーンをGMTに設定して見てください。3日前又は72時間前でフィルタすると3日前のレコードが表示されます。

HitoshiOzawa_0-1730332439418.png

システムのタイムゾーンをAsia/Tokyoに変更することもできますが、推奨されていません。

 

一応次のスクリプト-バックグラウンドで抽出することができます。

var tz = gs.getSession().getTimeZone();
var gdt = new GlideDateTime();

var today = gdt.getLocalDate();
gdt = new GlideDateTime(today + ' 15:00:00');  // GMT時間 24:00 - 9:00
gdt.setTZ(tz);
gdt.addDays(-3);

var gr = new GlideRecord('<テーブル名>');
gr.orderBy('<日付時刻フィールド名>');
gr.addQuery('<日付時刻フィールド名>', '<', gdt);
gr.query();
while (gr.next()) {
	gs.print(gr.<日付時刻フィールド名> + " " + gr.<日付フィールド名>.getDisplayValue());
}

>システムのタイムゾーンをAsia/Tokyoに変更することもできますが、推奨されていません。

タイムゾーンをAsia/Tokyoに変更することは非推奨なのですね。。

開発環境のタイムゾーンはAsia/Tokyoとなっており、複数のプロジェクトでこちらの設定を使用しているため、タイムゾーンを変更することはできそうにありません。。

(こちらの環境に合わせて、私のPDIの設定もタイムゾーンはAsia/Tokyoにしておりました。)
フィルタリングを正しく使用するためには、GMTにする他なさそうなので、別の手法を考えてみます。

@U3D4 

>GMTにする他なさそうなので、別の手法を考えてみます。

 

ユーザのタイムゾーンをGMTに変更しなくてもできます。ユーザのローカルタイムゾーンをGMTに変更すると正しく3日より前のレコードが正しく選択されることで確認することができたと思います。

 

今回の問題は質問のように時間が問題ではなく、GMTの日付で比較していることです。フィルタリングをローカルタイムゾーンで行うようにしたら問題は解決します。日本に限らず米国を含むServiceNowのユーザの多くのローカルタイムゾーンはGMT以外なで、ローカルタイムゾーンでテーブルのフィルタリング条件を指定する対策は既にあります。反対に言うと、このようなことができなければServiceNowは米国でも世界中で使われていません。

takshisan
Kilo Guru

下記ドキュメントを確認したところ、[relative]の制御は時や分などの時間の絞り込み時に用いるようです。
では3日前とする場合は、おそらく、[after]で絞り込むように考えられます。


・Values for date/time fields
https://docs.servicenow.com/bundle/xanadu-platform-user-interface/page/use/common-ui-elements/concep...
Operators available for date/time fields
Operators:after
Definition:Returns records after the specified time period.
Example:A filter run [after] [Next Month] on April 18, 2018 will return records from June 1 and later.