2013-02-04 25 views
3

我從php5腳本中的Oracle數據庫中檢索數據。 我希望返回一個特定的時間戳格式。 我發現說,一個類似甲骨文本身的聲明會做的伎倆對SO答案:php oci8 - 如何設置oracle時間戳返回格式

$stid = oci_parse ($connection, "alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss.ff3'"); 
oci_execute ($stid); 

應保證像被返回

$stid = oci_parse ($connection, 'select * from table'); 
oci_execute ($stid); 

結果時間戳格式的後繼查詢以正確的格式。

但無論我做什麼,我總是格式,如

28-NOV-12 05:37:24.000000 PM 

所以我的問題是:什麼是錯的?在php中執行什麼語句來確保檢索想要的時間戳格式?

問題:如何確保php檢索ISO 8601格式的時間戳,因此字符串如2012-11-28T17:37:24.000Z

以及如何確保'Z'在這種情況下,因此不像2012-11-28T16:37:24.000 + 01:00

+0

你是否在相同的'$ connection'上運行後續查詢? –

+0

yes scusi我犯了一個錯誤:$ conn和$ connection - 每次都應該是相同的連接 - 我糾正了這個問題。 – Maestro13

+0

嗯,嘗試從格式中刪除'.ff3','DATE'沒有小數秒,所以我不確定這個格式是否有效。 –

回答

4

ff3對於DATE數據類型無效,因爲它不包含小數秒。

至於你的ISO8601格式,只有TIMESTAMP WITH TIME ZONE有一個實際的時區。如果你想用Z(即UTC)格式化,你可以做;

ALTER SESSION SET TIME_ZONE = 'UTC'; 
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"'; 

然後,當您選擇一個TIMESTAMP WITH TIME ZONE時,您將以該格式獲得它。

如果您需要格式化DATETIMESTAMP那樣,您可以通過使用格式來僞造時區部分;

ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy-mm-dd"T"hh24:mi:ss".000Z"' 
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"' 

SQLfiddle for testing here