Monday, October 31, 2011

Informix Select


整理的很好的網站
也有很多SQL的語法範列,容易了解
http://programmingexamples.wikidot.com/informix-select#toc8

Thursday, October 27, 2011

informix 找 年 的函數

SELECT  date_created,  date_updated
FROM tableName
WHERE YEAR(date_created) = '2011'
回傳 日期 等於 2011年 的資料

SELECT YEAR(TODAY)
  FROM SysMaster:SysDual;

Similarly for MONTH, DAY, WEEKDAY (0..6). You could use CURRENT instead of TODAY, but that generates a DATETIME value which is then converted to DATE and then analyzed.
參考來源:
http://stackoverflow.com/questions/6707026/informix-isql-date-function-help

民國年的寫法 ( JSTL + EL + informix )

一、將資料庫存放的  西元年 轉成 中國年:
   1: /**
   2:  * 將西元年 轉成 中國年
   3:  */
   4: public static Date convertToMinguo(Date date){
   5:     if( date != null ) {
   6:         Calendar cal = Calendar.getInstance();
   7:         cal.setTime(date);
   8:         int year = cal.get(Calendar.YEAR) - 1911;
   9:         int month = cal.get(Calendar.MONTH);
  10:         int day = cal.get(Calendar.DAY_OF_MONTH);
  11:         cal.set(year, month, day);
  12:         return cal.getTime();
  13:     }       
  14:      return null;       
  15: } 

二、在JSPE畫面呈現中國年的方法:

   1: <%@ page language="java" contentType="text/html;charset=UTF-8"%>
   2: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
   3: <%@ taglib prefix="i18n" uri="http://www.bea.com/servers/p13n/tags/internationalization" %>
   4:  
   5: <fmt:setLocale value="zh-TW"/>
   6: <!-- 中國年的格式,可以定義在多國語言的設定檔裡,
   7:             省的每個人都要key ( pattern="yyyy年MM月dd日"  ) -->
   8: <c:set var="minguoPattern">
   9:         <i18n:getMessage messageName="minguopattern" />
  10: </c:set>
  11: <fmt:formatDate var="dateBegin" 
  12:                        value="${bulletin.dateBegin}" 
  13:                      pattern="${minguoPattern}" />
  14: <!-- 把 O100 TRIM 成 100 -->
  15: <c:out value="${fn:substringAfter(dateBegin, '0')}"/>

三、比較麻煩的是以 日期 為查詢條件,因為 informix的日期函數: DATE(),是以一個字符串變量為參數,其格式由環境變量 DBDATE 指定, 並返回一個 DATE 類型。在setnet32中格式必須設為是「MDY4/」

   1: /**
   2: * @param str 格式:100/MM/dd
   3: * @return  西元年:MM/dd/yyyy
   4: */
   5: public static String convertMDY4(String str){
   6:    if( str != null && !str.trim().isEmpty()) {
   7:        String year = str.substring(0, 3);
   8:        int y = Integer.parseInt( year ) + 1911;
   9:        String month = str.substring(4, 6);
  10:        String day = str.substring(7,9);
  11:        return String.format("%1$s/%2$s/%3$s", month, day, String.valueOf(y) );
  12:    }       
  13:     return null;       
  14:  }

四、最後,是資料確定要進資料庫之前,一定要再轉回西元年
為什麼? 因為要維持資料的一致性

Thursday, October 20, 2011

SQL UPDATE CASE WHEN 的使用方法

前幾天赫然發現系統中所有的進帳的交易是寫成出賬的。
先罵自己蠢之後趕快更新資料庫裡所有的交易。

分辨進出賬欄位名稱是 TransactionType:
I 代表進帳,O 代表出賬。

很不幸的所有的I跟O都對調了,不過還好的是一行SQL就可以解決。

UPDATE Transactions SET TransactionType = (
  CASE TransactionType
  WHEN 'I' THEN 'O'
  WHEN 'O' THEN 'I'
  ELSE TransactionType END)


如果不用CASE WHEN要分兩次更新幾乎不可能,因為所有的I變成O之後就無法區分哪些O需要被改成I了。

以上的SQL可以再加上WHERE TransactionType IN ('I', 'O') 限制只改進賬跟出賬交易。

加上UPDATE FROM的做法,SQL的UPDATE可以做到很活。