【发布时间】:2020-10-23 10:54:43
【问题描述】:
我正在通过数据库内公式使用 SAP HANA SQL(通过 Alteryx)。
我有两个字段(月份和年份),我需要将它们转换/组合成一个字段,显示为 YYYY-MM-DD。我可以在 Alteryx 本地成功地做到这一点,但我需要通过 SQL 在数据库中实现这一点。
查看图片了解 Alteryx 中的成功本地转换:
【问题讨论】:
我正在通过数据库内公式使用 SAP HANA SQL(通过 Alteryx)。
我有两个字段(月份和年份),我需要将它们转换/组合成一个字段,显示为 YYYY-MM-DD。我可以在 Alteryx 本地成功地做到这一点,但我需要通过 SQL 在数据库中实现这一点。
查看图片了解 Alteryx 中的成功本地转换:
【问题讨论】:
这里似乎有两个目标:
year 和month 信息构造一个有效日期。YYYY-MM-DD
第一部分可以像这样在HANA中完成:
to_date( "<year_column>" || "<month_column>", 'YYYYMM') as newDate
双管道|| 运算符连接字符串,这意味着如果<year_column> 和<month_column> 数据还不是字符串值,则它们将首先转换为字符串。 p>
然后将连接的字符串转换为 date 数据类型。 to_date 转换函数采用模式字符串 YYYYMM,由于缺少 day 信息,它会即时补上并将日期设置为该月的第一天。
此to_date 转换还会检查是否仅创建了有效 日期。
例如,如果MM 不是介于01 和12 之间的值,则转换将失败并出现错误。
这让我想到了下一个需要注意的潜在障碍:转换字符串模式YYYYMM 要求正好有四位数字表示年份,而正好有两位数字表示月份。
虽然这对于现有的 year 数据可能没问题,因为现在大多数日期都用四位数表示,但 month 数据很可能没有 前导零(例如,当数据当前存储在数字字段中时)。
要“修复”这个问题,我们可以只为到目前为止只有一位数字的所有值添加前导零。在 HANA 中有几种方法可以做到这一点,因为这似乎不在 ABAP 上下文中,所以我会选择一种适用于大多数 SQL 数据库的方法:LPAD ("<month_column>", 2, '0')
这使我们得到第 1 步的以下表达式:
to_date( "<year_column>" || LPAD ("<month_column>", 2, '0'), 'YYYYMM') as newDate
现在第 2 步相对简单:将我们在第 1 步中构建的日期-数据转为特定格式。
由于 date-data 本身没有特定的输出格式(即,您可以以任何您喜欢的方式显示或打印相同的日期格式 - 它不会更改数据),它需要为此转换为字符串。
其转换函数称为TO_NVARCHAR(),也可以采用转换模式:
to_nvarchar( "<date_data>", 'YYYY-MM-DD') as fixedFormatDate
就是我们要找的这个问题。
将所有内容放在一个表达式中:
to_nvarchar(to_date( "<year_column>"
|| LPAD ("<month_column>", 2, '0')
, 'YYYYMM')
, 'YYYY-MM-DD') as fixedFormatDate
虽然这是对一个看似简单的问题的冗长回答,但我认为了解此转换所需的所有相关步骤非常重要。
【讨论】:
YYYYMM 模式不匹配。检查这些输入列以查看偏差来自何处。