SQL一二三事
SQL是一種資料庫查詢語言的標準。依尋這些標準,資料庫的設計變得有跡可尋,也讓使用者、資料庫管理者更能方便學習與管理資料庫(以下稱DB)。
然而,各家DB大廠對SQL標準的支持呈度不同,也不知道是在搞什麼特色,讓Jackmis被一個小問題惡搞了兩個小時左右...
#在M$SQL計算日差
DATEDIFF(DAY, GETDATE(), db_date)
DATEDIFF函式會把GETDATE(今天的日期)減掉db_date的日期,並以DAY(日)為準,傳回相差的天數。比如今天是2008/7/15,而db_date的內容是20080720,則結果就是-5
當Jackmis把上面的式子放到DB2的時候...恐怖的來了...
#DB2字元切割
原本想利用date()函數,讓db_date的字元直接換成日期型態...沒想到,DB2的date()比較弱,沒辦法識別。所以我只好把20080720轉成2008-07-20了。
我的首次切法是:
left(db_date,4)+'-'+mid(db_date,5,2)+'-'+mid(db_date,7,2)
結果失敗了。因為
1. DB2的字串相連是用兩個水管符號(︱︱),在網頁上會被拿掉,所以我用全形字。
2. DB2沒有mid函數;這函數的效果是取中間字串的函數,比如mid('abcd',2,2)='bc'才對,但DB2不是這個名字,而是substr(),用法一樣(搞特例)。
然後,改成:
left(db_date,4)︱︱'-'︱︱substr(db_date,5,2)︱︱'-'︱︱substr(db_date,7,2)
得出2008-07-20。但轉日期時還是失敗...
#DB2字元轉日期
這時候,在下已經很想罵人了...看了很多文章發現一些怪怪的現象,於是我試了
substr(db_date,1,4)︱︱'-'︱︱substr(db_date,5,2)︱︱'-'︱︱substr(db_date,7,2)
將left改用substr這個函數。然後再用date函式包起來,就轉成日期型態了!
倒底為什麼不能用left呢?這是個謎...
#在DB2計算日差
最後,GETDATE函式在DB2裡面沒有,請改用current date(或current_date),如下:
days(current date)-days(substr(db_date,1,4)︱︱'-'︱︱substr(db_date,5,2)︱︱'-'︱︱substr(db_date,7,2))
然後就可喜可賀...
神呀...制裁這些讓世界更複雜的人吧...更...
參考資料:
http://www.ibm.com/developerworks/cn/db2/library/techarticles/0211yip/0211yip3.html
http://www.tek-tips.com/viewthread.cfm?qid=1175566&page=1