Power Apps で日付や時間計算する機会があったので、いろいろとごちゃごちゃ計算をこねくり回していたんですが、ちゃんと DateDiff関数の定義をよむと、ほとんどのケースが DateDiff のオプションを正しく指定することで実現できたので、メモを残しておきます。
日付の引き算
例えばStartとEndで日数を計算するようなケースです。
この場合には単純にオプションも何もなく、DateDiffです。
例えば 2020/01/24 と 2020/02/02 の差は
DateDiff(DateTimeValue("2020/01/24"),DateTimeValue("2020/02/02")) // -> 9 (日)
唯一気を付けるのは、関数のインプットは引き算とは逆だということくらいです。 (先に指定する方が Start )
もしこれを時間単位で取得したい場合には、
DateDiff(DateTimeValue("2020/01/24"),DateTimeValue("2020/02/02"), Hours) // -> 216 (時間)
DateDiffは "Date" といいつつ、DateTime型の入力を対象としていて、かつ返す結果の単位を指定できます。
最後のオプションは省略可能で、Milliseconds, Seconds, Minutes, Hours, Days, Months, Quarters, Years
が選べます。
既定ではDays
です。
時間の引き算
これも「時間をValueに変えて、得られるのがミリ秒だから、1000で割って~」という面倒なことをしていましたが、不要でした。
DateDiffは時間も対象とできるので、この関数でオプションを指定するだけです。 (単に時間を指定した場合には1970/01/01に日付がセットされたDateTime型になります)
例えば 15:30 と 13:20 の差は時間単位で
DateDiff(TimeValue("13:20"), TimeValue("15:30"),Hours) // -> 2 (時間)
...おや?2時間10分なのに、10分どこいった? となりますね。
DateDiff関数でオプション (単位) を指定した場合、小数点以下は切り捨てされます。
もし10分を残したいなら、一つ下の単位で差を求めてから、割り算する必要があります。
DateDiff(TimeValue("13:20"), TimeValue("15:30"),Minutes)/60 //-> 2.166667 (時間)
先ほどとは異なり、,Minutes)/60
となっているのがポイントです。小数点を含むように求めるのであれば、まずは一つ下の単位をつかってください。
日付+時刻の引き算
これまでと同様に日付+時刻でも同じように DateDiff で計算できます。
DateDiff(DateTimeValue("2021/1/2 13:20"), DateTimeValue("2021/2/2 15:30"),Hours)/24 //->31.08333333 (日)
2時間10分 の部分が0.83333 として得られていることが分かります。
ちょっと工夫すると、XX日 YY時間 という表現もできます。
これを得るには「指定した単位の小数点は切り捨てされる」ことを思い出すと
DateDiff(DateTimeValue("2021/1/2 13:20"), DateTimeValue("2021/2/2 15:30"),Days)
&"日と"&
DateDiff(DateTimeValue("2021/1/2 13:20"), DateTimeValue("2021/2/2 15:30"),Hours)-24*DateDiff(DateTimeValue("2021/1/2 13:20"), DateTimeValue("2021/2/2 15:30"),Days)
&"時間" //->31日と2時間
日数はオプションなしでもよいですが、単位を Days にすることで得られます。
残りの 時間 ですが、全部を時間で取ってから、日数x24時間 を引いてあまりの時間を得ています。
このように、単純な計算式とオプションの指定だけでたいていのことはできます。
#おわり
DateDiffはとても便利な関数です。
とりわけ、こういった計算で得られる値はデータソースに含まれないことが多いので、アプリ側で表示対応を行う必要があります。
ググると小難しい計算をしているところもありますが、まずはDateDiffとオプション指定で対応できないか考えてみてはいかがでしょうか。