SharePoint REST APIで「日付と時刻」列に対してフィルターするときに、使えそうなこと。

## はじめに
SharePoint REST APIエンドポイントにクエリ文字列を付与して、返却されるデータをフィルターすることがままあります。

フィルター式には様々な演算子がサポートされており、今回は **「日付と時刻」列に対して演算子を用いてフィルターする** ときに知っておくと良さそうなことのメモです。

### 参考
https://learn.microsoft.com/ja-jp/graph/filter-query-parameter?tabs=http

https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/get-to-know-the-sharepoint-rest-service?tabs=csom

## 早速フィルターをかけてみる

使用するリストは以下です。

<img width="70%" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/7063f084-1923-6b2e-3748-15ce275b3349.png">


「日付と時刻」で作成した公開日（内部名：StartDate）列に対して、いろいろなフィルターをかけてみます。

### 1. 等しい (eq)
#### クエリ

```typescript
$filter=StartDate eq 'UTC日付文字列'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/9818c93a-57e8-506f-ae26-0c06db989989.png)

:::note warn
日付文字列をシングルクォーテーション（' '）で囲うのを忘れないように！
また、クエリにはUTC形式（日本時間 - 9時間）の文字列を付与しています。
JST形式でも可能そうなのですが、十分に調査できていないので、ここではUTC形式にしています。
:::
#### クエリの意味
「公開日が 2023年1月11日 のアイテムに絞り込みたい！」


#### 結果
レスポンスデータをコンソールに出してみます。
※アイテムの「開始日」という表記になっていますが、ミスです・・。正しくは「公開日」となります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/42a80734-941b-321f-0184-0c4f153bf771.png)

公開日が 2023年1月11日 のアイテムが1件のみ取得できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/35c02fbe-365f-8083-a00f-99a1c4461f97.png)


### 2. 以下 / 以前 (le)
#### クエリ
```typescript
$filter=StartDate le 'UTC日付文字列'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/0a7c9891-12da-f067-7cb2-9120f53ed350.png)

#### クエリの意味
「公開日が 2023年1月11日 **以前**（2023年1月11日**を含む**）のアイテムに絞り込みたい！」

#### 結果
公開日が 2023年1月11日 以前のアイテムが3件取得できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/de1e2f25-5d80-4c4d-5db8-50b45fc6da5c.png)
### 3. ～未満 / ～より古い (lt)
#### クエリ
```typescript
$filter=StartDate lt 'UTC日付文字列'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/787d3a86-b5c5-35a4-ee70-d1a5446ba3bf.png)
#### クエリの意味
「公開日が 2023年1月11日 **より古い**（2023年1月11日**を含まない**）アイテムに絞り込みたい！」
#### 結果
公開日が 2023年1月11日 より古い2件が取得できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/fcf27906-b953-5b0c-8a4c-eec2c372d24a.png)

### 4. 以上 / 以降 (ge)
#### クエリ
```typescript
$filter=StartDate ge 'UTC日付文字列'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/b1d62eb4-a6a3-936b-4664-b070df83613b.png)

#### クエリの意味
「公開日が 2023年1月11日 **以降**（2023年1月11日**を含む**）のアイテムに絞り込みたい！」
#### 結果

公開日が 2023年1月11日 以降の3件が取得できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/90b32708-6618-7da6-15b9-622e12ce24d2.png)

### 5. ～より大きい / ～より新しい (gt)
#### クエリ
```typescript
$filter=StartDate gt 'UTC日付文字列'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/7bab1bc5-cfa9-1265-9640-ff9ecb514333.png)
#### クエリの意味
「公開日が 2023年1月11日 **より新しい**（2023年1月11日**を含まない**）アイテムに絞り込みたい！」
#### 結果
公開日が 2023年1月11日 より新しい2件が取得できている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/f2219fa3-f424-734e-6318-65fa52386bf4.png)

### そのほかにも・・・
 **AND条件**を使って複数の条件を設定することもできます。
 
さきほどのリストに終了日列（内部名: EndDate）を追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/3c3f8b2a-733e-856a-278c-9382bbe82576.png)
#### クエリ
```typescript
$filter=StartDate le 'UTC日付文字列' and EndDate ge 'UTC日付文字列'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/e594d867-bbcc-d701-f505-131849f2dc2d.png)
#### クエリの意味
※ 今日が、2023年1月12日という前提で。

「公開日が今日より前の日付で、終了日は今日より後の日付のアイテムに絞り込みたい！」
#### 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781744/2b81f334-2126-3c05-eb0f-346c20c75fd8.png)

5件のアイテムの内、
公開日が2023年1月12日以前であり、終了日が2023年1月12日以降で設定された、
テスト2とテスト3のアイテムが取得できています。
<br>
<br>
このようなフィルターをかけることで、有効期限内のアイテムだけ取得する！なんてこともできそうです。


## おわりに
やや煩雑な説明になってしまった気がするのですが、、、演算子を用いた日付データの比較は、混乱してしまうことが多いので、これを機に良い復習ができました。
フィルタークエリを使って、取得するアイテムを制御できるのは便利ですね！
ほかにも様々な演算子やクエリオプションが存在するので色々と試してみたいです。