如何在SAP的HANA中处理日期转换中的异常?

时间:2018-04-05 17:11:48

标签: sql hana hana-studio webi

问题摘要:

在尝试转换为某个日期以便用户可以过滤数据时,HANA SQL或HANA Studio在视图(计算,属性或分析)中处理无效数据的正确方法是什么?

在SAP的表KONM中,字段KSTBM是十进制数据类型(15,3)。此字段对或错,以YYYYMMDDHHM.MSS格式存储日期值。 (我是一个用户而不是系统的设计者。为什么有人在十进制字段中存储日期而不是日期/时间字段哦超出了这个问题的范围。)

如此有效的值,如:

  • 201703290(是2017年有效年03有效月份,29是该年当月有效日。)
  • 201703301.130(是2017年有效年03有效月份,30表示该月当月有效日期,11:30为有效时间)

存在且可以使用to_timestampdaydate或类似功能轻松投射。

不幸的是,此表中的一些错误条目导致数据无法转换为日期时间,例如:

  • 201702290(2017年2月无效,29天没有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_Timestampdaydate函数时,会出现以下错误:

  

SAP DBTech JDBC:[2048]:列存储错误:搜索表错误:[6860]无效的日期,时间或时间戳值;

  

[303]:无效的DATE,TIME或TIMESTAMP值:

我同意这些是无效日期......因此我知道为什么会抛出错误。

虽然我想修复根本原因,然后纠正错误的数据;这不是一个选择。不同的团队,不同的资源不同的优先所以这是他们要做的事情列表,但我有需要WEBI报告的用户;由于存在不良数据......我仍然需要处理它。

我要做的是在HANA Studio中创建一个Calculated_view,它可以成功处理这些错误的日期。但我无法找到try catch或其他类型的异常处理,这将允许我基本上将这些日期设置为NULL,这样用户仍然可以获取其他相关数据,并且能够看到它们中有一些不良数据。可以纠正的系统。

由于抛出此错误,因此在运行WEBI报告时无法从Universe返回任何记录。我找到了一些选项,包括创建一个包含所有可能时间的日期/时间表....(我希望你能看到我不想这样做的原因)或创建一个函数(但它没有具体的指示;我毕竟是HANA和Universes以及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,然后可以将空数据作为用户选项包含/排除?
  3. 在视图中是否有一种方法可以在计算列中识别这些错误记录,因此如果无效,我们不会尝试转换它们并在有效时尝试?
  4. 我的方法是否完全错误,我需要重新训练我的Oracle / MS SQL / MySQL大脑以不同的方式思考?其他语言我会处理异常,或尝试捕获或使用isdate()在尝试投射之前检查有效...我只是没有在这里看到这些选项(但我是新的,也许根本无法使用非常好的帮助)
  5. 感谢您阅读我冗长的问题。希望我已经提供了足够的细节。

    我试图避免:

1 个答案:

答案 0 :(得分:1)

您可能希望使用tstmp_is_valid()功能:

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 KSTBM,
         tstmp_is_valid(KSTBM*100000), 
         isBad
  FROM MyExample A;

KSTBM           TSTMP_IS_VALID(KSTBM*100000)    ISBAD
201,701,011.23  1                               0    
201,702,301     0                               1    
201,702,171.23  1                               0    
201,702,192.4   0                               1    

请参阅CDS documentation