Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

php odbc 抓不到處理過的 select 欄位?
post by tommy @ 02 十一月, 2006 15:15
我們公司所使用的交換機, 有提供一個軟體可以抓取交換機的資料出來, 這個軟體, 只能在 windows 下頭執行, 且可以定時把我們要的資料, export 到檔案出來. 我們利用 php 寫了幾個小程式, 用來讀取這些檔案, 然後把資料塞回我們使用的 postgresql 資料庫中, 方便我們後頭的分析處理. 而在 windows 下存取 linux 上的 postgresql, 我們是利用 ODBC 來處理. 幾年下來, 一切運作都還算正常.

不過最近, 我們替這幾個 php script, 加上一些功能, 去抓取同樣 postgresql 資料庫中的資料, 先行運算後再存回去, 加速我們後續查詢的作業. 這個動作, 也不過就是把原本後頭報表會跑到的一個 SQL 指令, 改放到這個 script 上頭, 如此在資料產生時, 就先計算過一次, 可以避免日後每跑一次報表就算一次的困擾, 算是以空間換取時間的作法.

但是, 下頭這個指令, 怎麼跑都有問題:

select case when (call_anstime > 300 or call_abntime > 300) then '1' else '0' end as over_sl,
count(*) as calls
from cti_call
where call_date = '20061001'
and call_time >= '000000'
and call_time <= '002959'
and call_skill = '5078'
group by 1

這個指令,  在 pgAdmin 上頭跑, 可以正確的得到資料. 如果在 Linux 下頭, 透過 php 的 pgsql 模組, 也可以正確的抓出資料. 就是在 windows 下使用 php 透過 ODBC 處理時, 第一個欄位每次都抓到空值.

試了很久,  一直想不出為什麼... 後來, 把上頭的指令改一下, 變成下頭的樣子:

select case when (call_anstime > 300 or call_abntime > 300) then 1 else 0 end as over_sl,
count(*) as calls
from cti_call
where call_date = '20061001'
and call_time >= '000000'
and call_time <= '002959'
and call_skill = '5078'
group by 1

很神奇的, 資料就可以正確的被抓出來了.

我想, 這可能是 postgresql 的 ODBC driver 或者是 php 的 ODBC module 有問題吧, 也許是無法正確判斷出上頭那個 case when 指令之後產生的資料型別吧. 我們把這個型別, 由字串換成數字後, 整個運作就正常了.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 61 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS