informix 日期边界处理

缘由: 以前没有学过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')

上一篇:前端记录用户页面停留时间


下一篇:informix索引分类