OutSystems 11でミリ秒を計測

## はじめに
株式会社メディアテック所属の @mt-h2 です。
普段は OutSystems を利用したローコードでシステム開発を行っています。
これから OutSystems に関してちょっとした困った事や検証結果等を記事としていく予定です。

今回は OutSystems のサーバアクションでミリ秒の計測を試したいと思います。

## 検証環境
- OutSystems 11（Personal Environment）
- Reactive Web Apps

## 前置き
OutSystems 11には、時間を計測する [Built in Action](https://success.outsystems.com/ja-jp/documentation/11/reference/outsystems_language/logic/built_in_functions/date_and_time/) が多数用意されています。
しかしながら、取扱う時間の最小単位が "秒" であり、パフォーマンス検証としてはせめて "ミリ秒" を使用したいところ。

ところが OutSystems に用意されているアクションやビルトイン関数ではミリ秒の計測が実現できず、Forge の利用が推奨されていました。弊社では Forge を社内開発で利用するには、諸々検証・申請・運用保守が必要となり、ちょっとした調査に使用したい場合はハードルが高くなります。

どうしたものかと困っていたところ、以下記事を開発メンバから教えていただきました。

> [【OutSystems】サーバー現在時刻をマイクロ秒単位で取得しよう!](【OutSystems】サーバー現在時刻をマイクロ秒単位で取得しよう!)
> これは非常に困ったことでして、ミリ秒の現在時刻を得るためにはミリ秒まで取得できるForge(参考ナレッジ:ミリ秒単位でロジックの処理時間計測を行いログ出力する方法)を使用したりIntegration StudioでC#のミリ秒取得アクションを作成したりする必要が出てきます。
今回はそういった案件によっては使用できない可能性がある処理に頼らず、ServiceStudioだけでミリ秒単位でサーバー時間を取得する方法をお伝えします。

おお！正に実現したかった手法！
どうやらデータベースの Timestamp を利用する方法のようですので、今回はこちらの記事を参考に、実際に動作確認していきます。

:::note info
[OutSystems Developer Cloud](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/) では [ミリ秒を取り扱うサーバアクション](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/outsystems_language_and_elements/libraries/datetime/#getticks) が追加されているので、ODC で開発されている方はこちらがおすすめです。
:::

## 実装
それでは記事を読みながら実装していきます。

### Timestamp 用 Structure 作成
データベースから取得した "時分秒" と "ミリ秒" を格納する Structure を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/f087af38-9ea0-ccd8-bad4-a18d87827370.png)
Attribute は Data Type 以外の値は任意で構いません。
最終的に取得データは以下のように格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/af2293f2-73a2-9c68-5db0-ad5f6bd555de.png)

### SQL 作成
1. 次に、サーバアクションを作成して SQL を配置します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/f0dd1216-2acd-0c53-410e-2b1829140425.png)
2. SQL をダブルクリックして設定ウィンドウを開きます
3. 左上のタブにある「Output Entities / Structures」を右クリックして、「Add `<作成したStructure>`」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/81f86670-fcce-dfec-4c56-cc0e26167669.png)
4. 以下のように「Output Entities / Structures」に作成した Structure が登録された事を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/b9d379c9-040d-8b77-36e0-d033a006e550.png)
5. 次に、左下のタブにある SQL を押下し、以下内容を入力
    ``` sql
    SELECT FORMAT(SYSDATETIME(), 'HH:mm:ss'), DATEPART(millisecond, SYSDATETIME())
    ```
    :::note info
    PE 環境のデータベースはデフォルトでは SQL Server であるため、Oracle を利用している場合は [今回参考させていただいている記事](https://www.ubs-ebisu.co.jp/%E3%80%90outsystems%E3%80%91%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%8F%BE%E5%9C%A8%E6%99%82%E5%88%BB%E3%82%92%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E7%A7%92%E5%8D%98%E4%BD%8D%E3%81%A7%E5%8F%96%E5%BE%97/) の Oracle 用 SQL を入力してください
   :::
6. SQL 設定ウィンドウを閉じて Publish
7. 再度 SQL 設定ウィンドウを開き、右下にある「Test SQL」ボタンを押下
8. 以下のように出力される事を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803085/592ab05d-570c-fb0c-7483-a18d85188b74.png)

これで取得した時間を用いて計測する事ができるようになりました。
やったぜ。

:::note warn
データベースの Timestamp を取得している為、取得した値はタイムゾーンによる現地時間で出力されます。PE 環境で設定変更していない場合は UTC で取得されるため、日本時間で取り扱いたい場合は JST に変換する必要があります。
:::

## あとがき
最初の投稿記事として、現在メイン業務で利用しているツールである OutSystems の記事を書かせていただきました。
今回はありがたいことに非常に参考になる記事を引用させていただきましたが、今後は自身発である内容で記事を書いていきたいと思います。
元々OSS島（C#、LINQラブ、LINQ教）出身であるため、OutSystems 以外の記事も書いていけたらなと思います。

## さいごに
株式会社メディアテックでは絶賛 [開発メンバを募集中](https://www.mediatech.jp/recruit) です。
ローコード開発だけではなく、RPAやBIエンジニア諸々多数の募集をしておりますので、みなさまのご応募をお待ちしております。