标签:边界 DATETIME 日期 informix DATE EXPRESSION day
缘由: 以前没有学过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')
标签:边界,DATETIME,日期,informix,DATE,EXPRESSION,day 来源: https://blog.csdn.net/linkeyzhu/article/details/118385723
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。