LoginSignup
3
1

More than 5 years have passed since last update.

ASTERIAで日付同士の差引きを求めるには?

Last updated at Posted at 2017-09-13

どうも~プログラムに近い書き方じゃないとASTERIAを使えないマンです.
それだと, ASTERIAの本当の良さを引き出せないので, 頑張ってマッパーを覚えようとしています.
今日はタイトルにあるように, 日付同士の差引きを求め, 一週間以上開いたもの見つけたいと思います.

DataCalcでは日付同士の計算はできない

DateCalcで日付算出
このDateCalcは
2017/09/01 に±5日 のように使用することを期待され,
日付"同士"の計算に使用できないので注意.

1つのコンポーネントでは出来ないようだ

公式の質問サイトに同じことが載ってあった
日数を取得することは可能でしょうか?
文字だけでわかりにくいのと, 投稿主のマッパーの勉強のために投稿.

// 日付データ, 現在の日時
"2017-09-01T00:00:00.000 JST","2017-09-12T00:00:00.000 JST"    // 1週間以上間隔が開いてる
"2017-09-02T00:00:00.000 JST","2017-09-12T00:00:00.000 JST"    // 1週間以上間隔が開いてる
"2017-09-03T00:00:00.000 JST","2017-09-12T00:00:00.000 JST"    // 1週間以上間隔が開いてる
"2017-09-04T00:00:00.000 JST","2017-09-12T00:00:00.000 JST"    // 1週間以上間隔が開いてる
"2017-09-05T00:00:00.000 JST","2017-09-12T00:00:00.000 JST"    // 1週間以上間隔が開いてる
"2017-09-06T00:00:00.000 JST","2017-09-12T00:00:00.000 JST" 
"2017-09-07T00:00:00.000 JST","2017-09-12T00:00:00.000 JST" 

ETL-20170912-1.png

Minus(二つの日付の引き算) -> Abs(絶対値取得) -> Div(データ=86400000) -> Round(切り捨て)

データ型をDateTimeにするだけで、
差引きの結果がUNIX時間になるようです。これは便利。
constの絵にstrとあるので、数値型に変更しなければならいのか?と思いましたが不要のようです。
86400000は1000(ミリ)*60秒*60分*24時間のことで, 1日をミリ秒で表したものですね.

意外と簡単にできました.

レイヤー定義の条件式はSQLのwhere句に相当する?

このことを知らなかったゆえ,いままでSQLで頑張って書いていたのさ!

ETL-20170912-2.png
赤枠囲みの"レイヤー1"タブをダブルクリックすれば, レイヤー定義の変更画面がでます.
条件式に$を入力すれば, 補完の値を選択できます。

以下, 結果です。
ETL-20170912-3.png

関数を自作できるだと?

関数コレクションとして作成しておけばいつでも再利用できるので便利です。

関数コレクションなるものがあるらしいので作ってみた。
ここ参照→マッパー関数を組み合わせて使うには

ETL-20170912-4.png

赤枠のところが関数に関するものです.

(右隣の外部変数やストリーム定義もつかったことないですね~)
作り方はいたって簡単! いつものマッパー同様作成し, 呼び出しはドラッグするだけです.

関数の発展

①入力値を制限できないのか?

if文やtry~catch文のように, 異常な値(今回の例では,Datime型以外のもの)が入力されたら,
はじくことができないのでしょうか?
知ってる方がいらっしゃいましたらご教示おねがしいます.

②レイヤーを組み合わせると複雑なことが出来る

現在は日付けの差引きだけですが,
入力3とレイヤーを追加して,constの値をレイヤーごとに変更してあげれば
年, 月, 日. 時間・・・などいろんなパターンの日付差引き関数が作れそうですね。

追記(実際にやってみた)

ETL-20170921-1.png

変換->キーから値の変換 を使うと便利です. (Linuxのヒアドキュメントと同じ使い方ができる!!!これはすごい!!)
これにより入力3の値に応じて, constの値を変化することができました.

また, 関数内だとマッパー関数しか使えないようです.
よって, 入力1・入力2のデータ型を判定するのはどうやら無理そうです.

月と年はミリ秒で表現すると一定ではないので、正確なものを作るのは大変です.

まとめ

今日は単純なマッパーを使ってみましたが, 個人的にはこれがすごく癖があって最初困惑しました.
QiitaではASTERIAの情報がほとんど載ってないので,
初心者の方とか困っている方は多いのではないのか?と個人的には思います(私もその一人)
みんなで有益な情報を出し合いましょう!!!

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1