Monday, October 31, 2011
Thursday, October 27, 2011
informix 找 年 的函數
SELECT date_created, date_updated
FROM tableName
WHERE YEAR(date_created) = '2011'
回傳 日期 等於 2011年 的資料
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
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 )
一、將資料庫存放的 西元年 轉成 中國年:
二、在JSPE畫面呈現中國年的方法:
三、比較麻煩的是以 日期 為查詢條件,因為 informix的日期函數: DATE(),是以一個字符串變量為參數,其格式由環境變量 DBDATE 指定, 並返回一個 DATE 類型。在setnet32中格式必須設為是「MDY4/」
四、最後,是資料確定要進資料庫之前,一定要再轉回西元年
為什麼? 因為要維持資料的一致性
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就可以解決。
如果不用CASE WHEN要分兩次更新幾乎不可能,因為所有的I變成O之後就無法區分哪些O需要被改成I了。
以上的SQL可以再加上WHERE TransactionType IN ('I', 'O') 限制只改進賬跟出賬交易。
加上UPDATE FROM的做法,SQL的UPDATE可以做到很活。
先罵自己蠢之後趕快更新資料庫裡所有的交易。
分辨進出賬欄位名稱是 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可以做到很活。
Subscribe to:
Posts (Atom)