【发布时间】:2018-09-15 14:31:01
【问题描述】:
问题摘要:
在尝试转换为日期以便用户过滤数据时,在 HANA SQL 或 HANA Studio 的视图(计算、属性或分析)中处理无效数据的正确方法是什么?
在 SAP 的表 KONM 中,字段 KSTBM 是十进制 (15,3) 的数据类型。此字段对错,以 YYYYMMDDHHM.MSS 格式存储日期值。 (我是用户而不是系统的设计者。为什么有人将日期存储在十进制字段而不是日期/时间字段中超出了这个问题的范围。)
所以有效值如:
- 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,它可以成功处理这些错误的日期。但是我无法找到 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,您会看到错误。
问题方面:
- 无论 isBad 是 1 还是 0,我怎样才能让这个查询正常运行?
- 是否有包含/不包含不良数据的方法/方式(也许在结果中将所有不良数据设置为 NULL,然后可以作为用户的选项包含/排除 null 数据?
- 是否有办法在计算列中识别这些不良记录,这样我们就不会尝试在无效时转换它们,而是在有效时尝试?
- 我的方法是否完全错误,我需要重新训练我的 Oracle/MS SQL/MySQL 大脑以不同的方式思考?其他语言我会处理异常,或者尝试捕获或使用
isdate()在尝试强制转换之前检查是否有效......我只是在这里看不到这些选项(但我是新手,也许根本无法使用帮助还不错)
感谢您阅读我冗长的问题。希望我已经提供了足够的细节。
我试图避免:
- https://blogs.sap.com/2017/05/10/to_date-to-isdate-udf-to-check-whether-string-is-date-or-not/
- 而 DATE_CHECK_PLAUSIBILITY 是一个 ABAP 函数(我正在寻找一个 SQL/HANA Studio 函数),但这是正确的道路......我认为......
【问题讨论】:
-
支持一个准备充分的问题,包括一个可执行的例子。干得好!
-
补充:虽然我们可以在 hana 查询中执行此操作,但如果这些字段将用作查询中的过滤器,我不建议从性能角度这样做。在大型数据集上,迄今为止的铸造性能非常糟糕;最好让您的用户搜索字符串或十进制日期。 (叹气)我认为这与基于函数的结果缺乏索引有关。
-
您可以通过创建计算列来创建一种“基于函数的索引”。但是,即使性能指南也提到,通常最好将比较文字值转换为正确的数据类型/格式,而不是比较列。
-
当时可能做错了什么。如果您要在计算视图中将字符串日期转换为日期;并允许用户传入“日期”数据类型进行过滤......我们使用 Hana 中的“计算列”来完成此操作。然后,我们在链接到计算视图的 BO 宇宙中的这个计算列上设置一个过滤器;表现很糟糕。当我们在宇宙中使用字符串日期而不是计算列时,性能提高了 10 倍。这可能是因为返回的结果集通常包含给定顶级产品层次结构的 100,000 多条记录。
标签: sql hana hana-studio webi