缘由: 以前没有学过INFORMIX 数据库,可现在项目的数据 ETL过程中必须要写informix的SP。于是照葫芦画瓢的写了一个SP。前几天运行还相当正常~ 。今天调用时发现报错信息:-1267: The result of a datetime computation is out of range. BAIDU/GOOLE了一些网站,发现是由于时间的边界问题,而我的SP中正好有多处使用到日期的处理函数。
找到出错的地方:LET v_time = v_day -1 UNITS MONTH ; --月份减一
分析原因:
原来informix里 v_day -1 UNITS MONTH 只是将v_day的对应月份减一、却不能把对应的日期减到合适日期。而今天又是20090331,结果就是20090231,不出错才怪呢~~
解决办法: 网上好多例子都是写单独函数处理。其实只要将informix的“不能把对应的日期减到合适日期”的问题处理掉即可。而解决这个问题方法就是将当前日期(v_day)依次往前减一天,直到此日期对应到上一月中也存在此日期即可。根据这个思路,用一小循环语句OK大吉~~
WHILE 1 = 1
ON EXCEPTION SET v_esql (--v_esql : define v_esql integer; 做为接受异常号)
IF v_esql <> 0 THEN (由于informix环境设置的不同,异常号可能为正、也可能为负)
LET v_day = v_day -1 UNITS day;
ELSE
RAISE EXCEPTION v_esql;
END IF;
END EXCEPTION;
LET v_time = v_day -1 UNITS MONTH ; --月份减一
EXIT WHILE;
END WHILE;
总结: 1、不熟悉的东西用起来,小问题都会变成大问题(俺可用了两个多小时才把问量前因后果给解决了~~ )
2、informix就是没oracle强大,这么个函数都会存在这样的小BUG~ 。
3、把informix日期函数又了解了一点点~~
附:infomix日期函数
1)DAY(DATE/DATETIME EXPRESSION) 返回指定表达式中的当月几号
2)MONTH(DATE/DATETIME EXPRESSION) 返回指定表达式中的月份
3)YEAR(DATE/DATETIME EXPRESSION) 返回指定表达式中的年份
4)WEEKDAY(DATE/DATETIME EXPRESSION) 返回指定表达式中的当周星期几
5)DATE(NOT DATE EXPRESSION) 返回指定表达式代表的日期值
6)TODAY 返回当前日期的日期值
7)CURRENT[first to last] 返回当前日期的日期时间值
8)COLNAME/EXPRESSION UNITS PRECISION 返回指定精度的指定单位数
9)MDY(MONTH,DAY,YEAR) 返回标识指定年、月、日的日期值
10)DATETIME(DATE/DATETIME EXPRESSION)FIRST TO LAST 返回表达式代表的日期时间值
11)INTERVAL(DATE/DATETIME EXPRESSION)FIRST TO LAST 返回表达式代表的时间间隔值
12)EXTEND(DATE/DATETIME EXPRESSION,[first to last])返回经过调整的日期或日期时间
字符串转换成日期格式 : to_date('2008-01-01','%Y-%m-%d')