用某天之后的日期填充 table 的最快方法是什么?
What is the fastest way to populate table with dates after certain day?
假设我们有以下输入参数:
- 日期[日期]
- 周期[整数]
任务如下:构建具有两列的 table:date 和 dayname.
所以,如果我们有 date
= 2018-07-12
和 period
= 3
那么 table 应该是这样的:
date |dayname
-------------------
2018-07-12|THURSDAY
2018-07-13|FRIDAY
2018-07-14|SATURDAY
我的解决方案如下:
select add_days(date, -1) into previousDay from "DUMMY";
for i in 1..:period do
select add_days(previousDay, i) into nextDay from "DUMMY";
:result.insert((nextDay, dayname(nextDay));
end for;
但我不喜欢循环。我认为如果我想将更复杂的值放入结果 table.
中可能会出现性能问题
实现目标的更好解决方案是什么?
运行 通过循环并一个一个地插入值肯定是完成任务的最慢的可能选择。
相反,您可以使用 SAP HANA 的时间序列 功能。
用像
这样的语句
SELECT to_date(GENERATED_PERIOD_START)
FROM SERIES_GENERATE_TIMESTAMP('INTERVAL 1 DAY', '01.01.0001', '31.12.9999')
您可以生成具有给定间隔长度的有限范围的有效日期。
在我的测试中,使用这种方法带来了时间来插入来自 ca 的一组日期。 9 分钟缩短到 7 秒...
我前段时间写过 here and here 如果您需要更多示例。
在这些示例中,我什至包括使用 系列表 来有效压缩时间戳列值。
系列数据函数包括 SERIES_GENERATE_DATE 其中 returns 日期数据格式的一组值。因此,您不必费心将返回的数据转换为所需的日期格式。
这是一个示例代码
declare d int := 5;
declare dstart date := '01.01.2018';
SELECT generated_period_start FROM SERIES_GENERATE_DATE('INTERVAL 1 DAY', :dstart, add_days(:dstart, :d));
假设我们有以下输入参数:
- 日期[日期]
- 周期[整数]
任务如下:构建具有两列的 table:date 和 dayname.
所以,如果我们有 date
= 2018-07-12
和 period
= 3
那么 table 应该是这样的:
date |dayname
-------------------
2018-07-12|THURSDAY
2018-07-13|FRIDAY
2018-07-14|SATURDAY
我的解决方案如下:
select add_days(date, -1) into previousDay from "DUMMY";
for i in 1..:period do
select add_days(previousDay, i) into nextDay from "DUMMY";
:result.insert((nextDay, dayname(nextDay));
end for;
但我不喜欢循环。我认为如果我想将更复杂的值放入结果 table.
中可能会出现性能问题实现目标的更好解决方案是什么?
运行 通过循环并一个一个地插入值肯定是完成任务的最慢的可能选择。
相反,您可以使用 SAP HANA 的时间序列 功能。 用像
这样的语句SELECT to_date(GENERATED_PERIOD_START)
FROM SERIES_GENERATE_TIMESTAMP('INTERVAL 1 DAY', '01.01.0001', '31.12.9999')
您可以生成具有给定间隔长度的有限范围的有效日期。
在我的测试中,使用这种方法带来了时间来插入来自 ca 的一组日期。 9 分钟缩短到 7 秒...
我前段时间写过 here and here 如果您需要更多示例。 在这些示例中,我什至包括使用 系列表 来有效压缩时间戳列值。
系列数据函数包括 SERIES_GENERATE_DATE 其中 returns 日期数据格式的一组值。因此,您不必费心将返回的数据转换为所需的日期格式。
这是一个示例代码
declare d int := 5;
declare dstart date := '01.01.2018';
SELECT generated_period_start FROM SERIES_GENERATE_DATE('INTERVAL 1 DAY', :dstart, add_days(:dstart, :d));