2

質問の概要:

ビュー (計算、属性、または分析) の HANA SQL または HANA Studio 内で、ユーザーがデータをフィルタリングできるように日付にキャストしようとするときに無効なデータを処理する適切な方法は何ですか?

SAP のテーブルKONM では、フィールドKSTBMは decimal(15,3) のデータ型です。このフィールドは正誤を問わず、日付値を YYYYMMDDHHM.MSS 形式で格納します。(私はシステムの設計者ではありません。日付/時刻フィールドの代わりに10進数フィールドに日付を格納する理由は、この質問の範囲を超えています。)

したがって、次のような有効な値:

  • 201703290 (はい、2017 年の有効な年 03 は有効な月であり、29 はその年のその月の有効な日です。)
  • 201703301.130 (はい、2017 年の有効な年 03 は有効な月であり、30 はその年のその月の有効な日であり、11:30 は有効な時間です)

to_timestampまたはdaydate類似の関数を使用して簡単にキャストできます。

残念ながら、このテーブルにはいくつかの不適切なエントリが作成されているため、次のようなデータは日時にキャストできません。

  • 201702290 (2017 年の 2 月の無効な日は 29 日ではありません)
  • 201713500 (無効な月 12 か月ではなく 13)
  • 201712312.400 (無効な時間 00:00:00-23:59:59 24 はありません)
  • 201712310.060 (無効な分 00:60 は 01:00 になります)
  • 201712310.090 (無効な分 00:90 は 01:30 になります)

to_Timestampこのような無効なレコードに対してまたは関数を使用するdaydateと、次のエラーが表示されます。

SAP DBTech JDBC: [2048]: 列ストア エラー: 検索テーブル エラー: [6860] 日付、時刻、またはタイムスタンプの値が無効です。

また

[303]: DATE、TIME、または TIMESTAMP の値が無効です:

それらが無効な日付であることに同意します...したがって、エラーがスローされる理由がわかりました。

根本的な原因を修正してから、悪いデータを修正したいと思っています。それは現在のオプションではありません。チームが異なれば、リソースが異なれば、優先順位も異なります。やるべきことのリストに載っていますが、WEBIレポートが必要なユーザーがいます。そして、悪いデータが存在するので...私はまだそれを処理する必要があります.

私がやろうとしているのは、これらの誤った日付を正常に処理できる HANA Studio で Calculated_view を作成することです。しかし、基本的にこれらの日付を NULL に設定できるようにする try catch またはその他のタイプの例外処理を見つけることができなかったので、ユーザーは引き続き他の関連データを取得し、中にいくつかの悪いデータがあることを確認できます。修正できるシステム。

このエラーがスローされてからの現状では、WEBI レポートの実行時にユニバースからレコードを返すことができません。可能なすべての時刻を含む日付/時刻テーブルの作成を含むいくつかのオプションを見つけました.... (私がそれをしたくない理由がわかると思います) または関数の作成 (ただし、特定の指示がありません;私は結局、HANAとユニバースとWEBIの新しいユーザーなので、質問が存在します)

HANA Studio で実行できる例を次に示します。

  WITH MyExample as (SELECT 201701011.230 as KSTBM, 0 isBad from dummy union all
                     SELECT 201702301.000 as KSTBM, 1 isBad from dummy union all
                     SELECT 201702171.230 as KSTBM, 0 isBad from dummy union all
                     SELECT 201702192.400 as KSTBM, 1 isBad from dummy)

  SELECT to_timestamp(To_DECIMAL(KSTBM*100000,15,0)) TS, 
         isBad
  FROM MyExample A
  WHERE isBad = 1

isBad を 0 に変更すると機能します。isBad を 1 に変更すると、エラーが表示されます。

質問の側面:

  1. isBad が 1 か 0 かに関係なく、このクエリをエラーなしで実行するにはどうすればよいですか?
  2. 不良データを含める/含めない方法/方法はありますか (おそらく、すべての不良データを結果に NULL に設定し、ユーザーのオプションとして null データを含める/除外できますか?
  3. 無効な場合はそれらを変換しようとせず、有効な場合は試してみるのではなく、ビューでこれらの悪いレコードを計算列で識別する方法はありますか?
  4. 私のアプローチは単に間違っているのでしょうか? Oracle/MS SQL/MySQL の頭脳を再訓練して、考え方を変える必要がありますか? 私が例外を処理isdate()するか、キャストを試みる前に有効かどうかを確認するためにキャッチまたは使用を試みる他の言語...ここではそれらのオプションが表示されません(ただし、私は初心者であり、おそらくヘルプをまだうまく使用できないだけです)

私の長く引き出された質問を読んでくれてありがとう。うまくいけば、私は十分な詳細を提供しました。

私は避けようとしています:

4

1 に答える 1