【QUERY関数④】コピペ可|日付の指定方法|初日・末日も判定&月替りで自動更新

関数教室
新任
新任

前回の話で、数値条件でデータを抜き出したり、それを並び替えたりする方法は分かりました!
これって日付でもできるんですか?

人事のプロ
人事のプロ

人事っぽくて良い着眼点ね!
その通り、同じ方法で条件指定や並び替えが可能よ。
但し、「date」という単語を頭につけたり、少しルールがあるのでササッと覚えてしまいましょう!

人事業務では、日付ベースで管理する情報が多くあります。

特に、毎月の給与計算では、日付によって支給する対象や方法が変わるため、重要なファクターになります

  • 入社者・退職者
    • 給与計算期間と入社日・退職日を確認
      • 支給有無
      • 日割計算
      • 社保控除
        などなど…
  • 休職者
    • 給与計算期間と休職期間を確認
      • 支給有無
      • 日割計算
      • 社保控除
      • 手当・控除の停止・再開
      • 住民税の徴収方法切り替え
        などなど…

従業員数が増えるほど誤支給などのリスクも高まるため、あらかじめ管理体制を整えておきましょう。

この記事を読んだら
  • QUERY関数「いつからいつまで」という日付範囲を指定してデータ抽出できる
    • TODAY関数EOMONTH関数で(今日から数えた)月数を指定して、その月初月末の日付を取得できる
      • QUERY関数に組み入れると、月替りで日付範囲をリアルタイム更新できる
        • 例えば、毎月給与計算に対応する休職者リストを、手入力無しで自動生成できる

基本|【date】日付指定の方法

QUERY関数日付指定する際のルールは以下の通りです。

  • date '指定する日付'
    • 日付として読み込むために、「'」で文字列にしてから、頭に「date」をつける
    • 数式内で指定する日付形式は「YYYY-MM-DD
      • それぞれ「-」で区切る
      • 日本語にすると「年-月-日」
        • 例:2021-5-15
新任
新任

「デート(date)したらバー(-)でチョメチョメ(' ')」と覚えました!

人事のプロ
人事のプロ

きもすぎ。

今回も、読売ジャイアンツを例に見ていきましょう。

読売ジャイアンツの選手データ
プロ野球データFreak2020年データより

指定した日付以降・以前

2000年以降に生まれた選手」を抜き出す場合、以下のようになります。

スプレッドシートでQUERY関数を使用して、2000年以降に生まれた選手を抜き出したキャプチャ
新任
新任

数値のように不等号で範囲指定できるんですね!

人事のプロ
人事のプロ

dateで日付として読み込んでしまえば、後のルールは同じよ。

せっかくなので復習しましょう!

以下の文字列をコピーして使用して下さい。(緑文字を置き換え)

=query('シート名'!$この列から:$この列まで,"select 列①,列②,列③ where 検索列>=date'YYYY-MM-DD'")

Copy
  • >(〜より後)
  • <(〜より前)
  • >=(〜以降)
  • <=(〜以前)
【補足】シートに関数をコピーする方法
  • 貼り付けたいセルにカーソルを合わせて「fx」欄に貼り付け
    • キーボード「F2」ボタン(セル編集)を押してから貼り付けでも可
スプレッドシートに関数をコピペするには、対象セルにカーソルを合わせて「fx」欄に貼り付けることを説明したキャプチャ

【not】一部を除いた期間

2000年以降に生まれた選手」を消去法で抜き出す場合、以下のようになります。

スプレッドシートでQUERY関数を使用して、2000年以降に生まれた選手を消去法で抜き出したキャプチャ

=query('シート名'!$この列から:$この列まで,"select 列①,列②,列③ where not 検索列<date'YYYY-MM-DD'")

Copy

【order by】日付による並び替え

2000年以降に生まれた選手」を「生まれ順(生年月日が早い順)」に並び替えると、以下のようになります。

スプレッドシートでQUERY関数を使用して、「2000年以降に生まれた選手」を「生まれ順(生年月日が早い順)」に並び替えたキャプチャ

=query('シート名'!$この列から:$この列まで,"select 列①,列②,列③ where 検索列>=date'YYYY-MM-DD' order by 検索列 asc")

Copy
  • order by 列(指定した列で並び替え)
    • asc(昇順で)
    • desc(降順で)

【and】指定した期間「いつからいつまで」

2000年に生まれた選手」を抜き出して「生まれ順(生年月日が早い順)」に並び替えると、以下のようになります。

スプレッドシートでQUERY関数を使用して、「2000年に生まれた選手」を抜き出して「生まれ順(生年月日が早い順)」に並び替えたキャプチャ

=query('シート名'!$この列から:$この列まで,"select 列①,列②,列③ where 検索列>=date'YYYY-MM-DD' and 検索列<date'yyyy-mm-dd' order by 検索列 asc")

Copy
  • 特定の月を期間指定する場合は「検索列>=当月初 and 検索列<翌月初
    • <翌月初」にすれば、自動的に「前月末日まで」が指定される
      • <=当月」にすると、月毎に日付を修正する手間が発生する
  • 給与計算など、末日の日付が必要な場合は「EOMONTH関数」を活用する(このあと紹介

実践|給与計算における休職者の整理

これまでの内容で、QUERY関数を使って「日付で範囲を指定・抽出する方法」は分かりましたね。

後半は、実務で使えるようになるために、人事の月次タスクである「給与計算」を取り上げて解説していきます

給与計算において、特に注意すべきポイントは「休職者」です。

冒頭でも触れましたが、休職期間によって日割計算手当・控除の休止・再開など、様々な要素が絡みます。

今回は、以下の前提でケーススタディを作成しました。

給与計算期間と休職者の関係図(月末締め、翌月15日払い)
月末締め、翌月15日払い(起算日:4/1,締め日:4/30,支給日:5/15)
休職データ
休職データ
新任
新任

デフォルトで従業員コード順だと、休職ステータスもバラバラで使いづらいですよね…。

人事のプロ
人事のプロ

いちいち日付を照らし合わせるのは疲れるし、時間の無駄よ。

関数で自動的にリストアップできるように仕組み化しましょう!

初級編:手入力による日付指定

休職中の従業員を抽出

休職データより「休職開始日が2021年4月1日以前」かつ「休職終了日が2021年4月30日以降」の従業員を抜き出すと、以下のようになります。

スプレッドシートでQUERY関数を使用して、「休職開始日が2021年4月1日以前」かつ「休職終了日が2021年4月30日以降」の従業員を抜き出したキャプチャ

=query('シート名'!$この列から:$この列まで,"select* where 検索列<=date'2021-4-1' and 検索列>=date'2021-4-30'")

Copy
  • 1営業日も勤務していない休職者を抽出
    • 少なくとも4/1と4/30は休職していることが条件になる

休職入りの従業員を抽出

休職データより「休職開始日が2021年4月1日より後」かつ「休職終了日が2021年4月30日以降」の従業員を抜き出すと、以下のようになります。

スプレッドシートでQUERY関数を使用して、「休職開始日が2021年4月1日より後」かつ「休職終了日が2021年4月30日以降」の従業員を抜き出したキャプチャ

=query('シート名'!$この列から:$この列まで,"select* where 検索列>date'2021-4-1' and 検索列>=date'2021-4-30'")

Copy
  • 月初に1営業日以上勤務している休職者を抽出
    • 少なくとも4/1は勤務しており、4/30は休職していることが条件になる

休職明けの従業員を抽出

休職データより「休職開始日が2021年4月1日以前」かつ「休職終了日が2021年4月30日より前」の従業員を抜き出すと、以下のようになります。

スプレッドシートでQUERY関数を使用して、「休職開始日が2021年4月1日以前」かつ「休職終了日が2021年4月30日より前」の従業員を抜き出したキャプチャ

=query('シート名'!$この列から:$この列まで,"select* where 検索列<=date'2021-4-1' and 検索列<date'2021-4-30'")

Copy
  • 月末に1営業日以上勤務している休職者を抽出
    • 少なくとも4/1は休職しており、4/30は勤務していることが条件になる

なお、日付条件セル参照する方法については、こちらの記事で解説しています。

中級編:関数による日付指定

月次タスクの場合、数式の日付を毎月修正するのは手間ですよね。

そんな作業を自動化できる方法について解説します。

QUERY関数日付部分を、これから紹介する2つの関数に置き換えるだけなので、是非ご活用下さい。

【TODAY/EOMONTH】日付を表す関数

まずは、日付を表す2つの関数を紹介します。

  • TODAY関数(今日の日付)
    • =today()
      • 上記でも表示可能だが、QUERY関数で使用するにはTEXT「YYYY-MM-DD」形式に変換する必要がある

=text(today(),"YYYY-MM-DD")

Copy
  • EOMONTH関数(月末の日付)
    • =eomonth("開始日",月数)
      • 月数は、当月なら0
        • 前月なら-1、前々月なら-2
        • 翌月なら1、翌々月なら2
      • こちらもQUERY関数で使用するには、開始月を「YYYY-MM-DD」形式に変換する必要がある

=text(eomonth("開始日",月数),"YYYY-MM-DD")

Copy

次に、この2つの関数を組み合わせます

具体的には、EOMONTH関数「開始日」TODAY関数に置き換えます

そうすることで、給与計算などに必要な月初・月末日付リアルタイム更新が可能になります。

給与計算期間と休職者の関係図(月末締め、翌月15日払い)
月末締め、翌月15日払い(起算日:4/1,締め日:4/30,支給日:5/15)

今回の例では、給与計算の作業月(today)が5月であるため、以下の数式で4月30日(前月末)という日付を表示できます

=text(eomonth(today(),-1),"YYYY-MM-DD")

Copy

また、月初の日付については、その1ヶ月前の末日に+1することで抽出できます。

同様に、5月に作業している前提で4月1日(前月初)という日付を表示するには以下のようになります

=text(eomonth(today(),-2)+1,"YYYY-MM-DD")

Copy

仕上げに、QUERY関数接続するため、数式を「"&&"」で括ります

QUERY関数の式内がミルフィーユ状に重なっていることを示した図
関数がミルフィーユ状に重なっているので分解して考える

以上で準備は整ったので、休職中休職入り休職明けの3パターンについて、自動抽出する方法を見ていきましょう。

休職中の従業員を抽出(日付自動)

休職データより「休職開始日が2021年4月1日以前」かつ「休職終了日が2021年4月30日以降」の従業員を抜き出すと、以下のようになります。

スプレッドシートでQUERY関数を使用して、「休職開始日が2021年4月1日以前」かつ「休職終了日が2021年4月30日以降」の従業員を抜き出したキャプチャ

=query('シート名'!$この列から:$この列まで,"select* where 検索列<=date'"&TEXT(eomonth(today(),-2)+1,"YYYY-MM-DD")&"' and 検索列>=date'"&TEXT(eomonth(today(),-1),"YYYY-MM-DD")&"'")

Copy

休職入りの従業員を抽出(日付自動)

休職データより「休職開始日が2021年4月1日より後」かつ「休職終了日が2021年4月30日以降」の従業員を抜き出すと、以下のようになります。

スプレッドシートでQUERY関数を使用して、「休職開始日が2021年4月1日より後」かつ「休職終了日が2021年4月30日以降」の従業員を抜き出したキャプチャ

=query('シート名'!$この列から:$この列まで,"select* where 検索列>date'"&TEXT(eomonth(today(),-2)+1,"YYYY-MM-DD")&"' and 検索列>=date'"&TEXT(eomonth(today(),-1),"YYYY-MM-DD")&"'")

Copy

休職明けの従業員を抽出(日付自動)

休職データより「休職開始日が2021年4月1日以前」かつ「休職終了日が2021年4月30日より前」の従業員を抜き出すと、以下のようになります。

スプレッドシートでQUERY関数を使用して、「休職開始日が2021年4月1日以前」かつ「休職終了日が2021年4月30日より前」の従業員を抜き出したキャプチャ

=query('シート名'!$この列から:$この列まで,"select* where 検索列><=date'"&TEXT(eomonth(today(),-2)+1,"YYYY-MM-DD")&"' and 検索列<date'"&TEXT(eomonth(today(),-1),"YYYY-MM-DD")&"'")

Copy

以上、日付の範囲指定について、ケーススタディも交えながら解説しました。

また、QUERYを使った便利な数式をすぐにコピペで使える「テンプレ集」も用意しているので、是非ご活用下さい。

タイトルとURLをコピーしました