【问题标题】:How does one handle exceptions in date casting in SAP's HANA?在 SAP 的 HANA 中如何处理日期转换中的异常?
【发布时间】: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_timestampdaydate 或类似函数轻松转换。

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

  • 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_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,然后可以作为用户的选项包含/排除 null 数据?
  3. 是否有办法在计算列中识别这些不良记录,这样我们就不会尝试在无效时转换它们,而是在有效时尝试?
  4. 我的方法是否完全错误,我需要重新训练我的 Oracle/MS SQL/MySQL 大脑以不同的方式思考?其他语言我会处理异常,或者尝试捕获或使用isdate() 在尝试强制转换之前检查是否有效......我只是在这里看不到这些选项(但我是新手,也许根本无法使用帮助还不错)

感谢您阅读我冗长的问题。希望我已经提供了足够的细节。

我试图避免:

【问题讨论】:

  • 支持一个准备充分的问题,包括一个可执行的例子。干得好!
  • 补充:虽然我们可以在 hana 查询中执行此操作,但如果这些字段将用作查询中的过滤器,我不建议从性能角度这样做。在大型数据集上,迄今为止的铸造性能非常糟糕;最好让您的用户搜索字符串或十进制日期。 (叹气)我认为这与基于函数的结果缺乏索引有关。
  • 您可以通过创建计算列来创建一种“基于函数的索引”。但是,即使性能指南也提到,通常最好将比较文字值转换为正确的数据类型/格式,而不是比较列。
  • 当时可能做错了什么。如果您要在计算视图中将字符串日期转换为日期;并允许用户传入“日期”数据类型进行过滤......我们使用 Hana 中的“计算列”来完成此操作。然后,我们在链接到计算视图的 BO 宇宙中的这个计算列上设置一个过滤器;表现很糟糕。当我们在宇宙中使用字符串日期而不是计算列时,性能提高了 10 倍。这可能是因为返回的结果集通常包含给定顶级产品层次结构的 100,000 多条记录。

标签: sql hana hana-studio webi


【解决方案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

还有一个函数:DATS_IS_VALID("STRINGDATE"),它将评估日期并返回 1 或 0。1 表示日期是否有效。

WITH CTE AS 
(SELECT '00000000' as STRINGDATE from dummy union all
SELECT '20190101'  from dummy union all
SELECT '20190230' from dummy union all
SELECT '20191301' from dummy union all
SELECT '20191232' from dummy union all
SELECT '20190228' from dummy union all
SELECT '20200228' from dummy union all
SELECT '20200229' from dummy )

SELECT StringDate, DATS_IS_VALID("STRINGDATE") isValid, case when DATS_IS_VALID("STRINGDATE") =1 then 
cast("STRINGDATE" as date) else cast(null as date) end RightDataType from CTE;

在上面的示例中,我们只是将日期转换为有效日期,并在结果中无效时将其设置为 null。如果您有正在保存但无效的字符串日期,则很有用。

【讨论】:

  • 完美!我正在寻找一个类似于 SQL Server 中的 isDate() 的函数!该文档也可能是我正在寻找的来源。谢谢!我是否认为 ABAP 函数可以从 Hana 工作室中调用(它有效,所以我猜是这样)?你知道这种方法是否会像 Oracle 在从 SQL 切换到 PL/SQL 时那样进行上下文切换,从而降低查询的性能?
  • 上下文切换是指从一个引擎切换到另一个已知会降低性能的引擎。诚然,它很有效,我的理念是做点什么,大笑,把它做好,然后让它变得更好。我现在正处于做某事和大笑的阶段。但询问正确的做法并使其变得更好,为成长做准备。
  • 这是很多问题...快速回答:不,您不能使用任何 ABAP 函数并在 HANA 中运行它(我提到的是 HANA 特定于 DB 的 CDS 函数的实现)。该函数的处理方式与任何其他内置 SQL 函数一样,不需要额外的“上下文”开关 - 它不是 SQLScript 函数,而是内置函数。希望对您有所帮助。
猜你喜欢
  • 2021-08-13
  • 1970-01-01
  • 2022-08-18
  • 2017-05-27
  • 1970-01-01
  • 2023-03-06
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多