いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Gスプレッドシート)日時から時刻(時間)部分を抽出する

 Googleスプレッドシートで、日時(日付と時刻が一緒に入力されているもの)の値から時刻(時間)の部分だけを抽出する方法についてです。
 方法によっては有効桁数が原因で誤差が生じるため、特に他の時刻や時間との比較に用いる場合は注意が必要です。

  • TIMEVALUE関数を使う方法やTIME関数を使う方法で日時から時刻部分を抽出できます。

TIMEVALUE関数を使う方法

 次の画像ではB3セル内に日時(日付と時刻を含む形式)が記録されています。
 一方でC3セルに次のような式を入力しています。

 C3セル

=TIMEVALUE(TEXT(B3,"h:m:s"))

 TIMEVALUE関数は日付や時刻を表す文字列の時刻(時間)部分を数値として取り出す関数です。そこでTEXT関数によりB3セルの値を「時:分:秒」型の文字列に変換したうえでTIMEVALUE関数の引数としています。TIMEVALUE関数は1日=1とみなすので1日の3分の1である「8:00:00」は0.333……に変換されます。
 ちなみにExcelと異なり日時を直接引数にすることが可能なので「=TIMEVALUE(B3)」としてもエラーにはなりませんが、正確な「8:00:00」とは異なる値になるためこのようにしています。この点については下記の注意点をご覧ください。



 このC3セルを選択してメニューから「表示形式」→「数式」→「時間」と選択すると、時刻の形式で表示されました。

TIME関数を使う方法

 こちらではC3セルにTIME関数を使った式を入力して時刻部分を求めています。

 C3セル

=TIME(HOUR(B3),MINUTE(B3),SECOND(B3))

 TIME関数は時,分,秒の3つの引数から時刻を生成する関数です。時,分,秒をそれぞれ「HOUR(B3)」「MINUTE(B3)」「SECOND(B3)」で求めてTIME関数の引数としています。
 式は長いですが表示形式を変えなくても時刻の形式で表示されるのがメリットです。

注意点

 他の候補として「=TIMEVALUE(日付時刻)」とか「=MOD(日付時刻,1)」といった式も考えられます。
 前者は上記のTIMEVALUEの例よりも簡単で自然に見えますし、後者は日付や時刻が内部的にシリアル値(数値)として管理されていることを踏まえ「小数部分だけ取り出せば時刻になる」という発想で作られた式です。
 実際に次の画像でC5セルとC6セルにそれらの式を入力しています。見た目は異なるものの、いずれも表示形式を「時間」に変えれば「8:00:00」になる値になっています。

 


 しかしカスタム形式を使って小数点以下の値を表示させていくと違いが出ます。
 C3,C4セル(上記の2つの例で紹介した式)では小数点以下15桁まで「3」が続きますが、C5セルとC6セルの値は異なる値となっています。

 これはGoogleスプレッドシートの有効桁数(計算の精度が確保できる桁数)が原因となっています。
 つまりC3,C4セルの式が「シリアル値の整数部分(日付部分)を省いて計算しているため小数点以下15桁まで精度を確保できる」一方でC5,C6セルの式が「整数部分(日付部分)を含めて計算しているため同じ桁(小数点以下15桁)までの精度が確保できない」ことが原因です。
 ただしどのような時刻でもこのような誤差が生じるわけではなく、例えば「2023/11/10 12:00:00」のシリアル値の小数部分は「0.5」なのでどの式を使っても同じ値になります。



 引き続きC3:C6セルの表示形式を「時間」に変えるといずれも「8:00:00」と表示されます。
 しかし「=」で比較してみるとC3セルとC4セルは等しいもののC3セルとC5セル、C3セルとC6セルは異なるという結果になります(C8~C10セルの結果)。
 これは当然ながら上記の画像で見たように値そのものが異なるからです。

 よって直接「8:00:00」と入力したセルと比較したときにC5,C6セルの値は異なる(より大きい)と判断されます
 用途によってはそこまで正確さを求める必要はないかもしれませんが、特に値を比較する場合(VLOOKUPなどの検索値に用いる場合なども含む)に誤った結果になることがあるので注意が必要です。