Informix 11.70.TC4:
我有一个 SQL 维度表,用于查找日期(pk_date)并向客户端返回另一个日期(plus1、plus2 或 plus3_months),具体取决于用户选择“1”、“2”还是“3” ”。
表架构如下:
TABLE date_lookup
(
pk_date DATE,
plus1_months DATE,
plus2_months DATE,
plus3_months DATE
);
UNIQUE INDEX on date_lookup(pk_date);
我有一个加载文件(管道分隔),其中包含从 01-28-2012 到 03-31-2014 的日期。
以下是加载文件的示例:
01-28-2012|02-28-2012|03-28-2012|04-28-2012|
01-29-2012|02-29-2012|03-29-2012|04-29-2012|
01-30-2012|02-29-2012|03-30-2012|04-30-2012|
01-31-2012|02-29-2012|03-31-2012|04-30-2012|
...
03-31-2014|04-30-2014|05-31-2014|06-30-2014|
..................................................... ...................................................
编辑: 乔纳森爵士DATE(pk_date + n UNITS MONTH
在 11.70.TC5 上使用的 SQL 语句有效!
我生成了一个 pk_date 从 01-28-2012 到 12-31-2020 的加载文件,并且 plus1、plus2 和 plus3_months 为 NULL。将此加载到 date_lookup 表中,然后执行以下更新语句:
UPDATE date_lookup
SET plus1_months = DATE(pk_date + 1 UNITS MONTH),
plus2_months = DATE(pk_date + 2 UNITS MONTH),
plus3_months = DATE(pk_date + 3 UNITS MONTH);
显然,DATE() 能够将 pk_date 转换为 DATETIME,使用 TC5 的新算法进行数学运算,并以 DATE 格式返回结果!
..................................................... ……………………………………………………………………………………………………………………………………
这个维度表的规则是:
- 如果 pk_date 在其月份中有 31 天,而 plus1、plus2 或 plus3_months 只有 28、29 或 30 天,则令 plus1、plus2 或 plus3 等于该月的最后一天。
- 如果 pk_date 在其月份中有 30 天,而 plus1、plus2 或 plus3 在其月份中有 28 或 29 天,则让它们等于该月的最后一个有效日期,依此类推。
- 所有其他日期都在下个月的同一天。
我的问题是:按照上述规则自动生成 pk_dates 过去 03-31-2014 的最佳方法是什么?我可以使用 SQL 脚本、“sed”、C 程序来完成这项工作吗?
编辑:我提到sed
是因为我已经拥有超过两年的数据,也许可以在这些数据之后对其余的数据进行建模,或者像这样的工具awk
更好?