天天看點

oracle10g擷取Date類型字段無時分秒解決辦法!

一般的資料庫中,date字段僅僅表示日期,不包括日期資訊,而oracle資料庫中的date資料類型是包括日期、時間的,對于不同的oracle jdbc驅動版本,對于該問題的處理都有些差別。

最近使用 oracle 10g,時間字段因需求,設為了date類型,發現hibernate用native sql 查詢或ibatis擷取result.getobject()的時候顯示不了時分秒,原來是jdbc驅動自動把date映射為 java.sql.date,故截斷了時分秒資訊,如果你使用9i或者11g 的驅動程式,就沒有該問題,但是oracle10g的jdbc驅動,你會發現沒有時分秒

,在oracle9.2之後,引入了内置資料類型timestamp。之是以引入它,是因為内置資料類型date的最小機關為秒;date的主要問題是它粒度不能足夠差別出兩個事件哪個先發生。9.2版本後oracle在date資料類型上擴充出來了timestamp資料類型,它包括了所有date資料類型的年月日時分秒的資訊,而且包括了小數秒(納秒nanoseconds級的)的資訊。如果你想把date類型轉換成timestamp類型,就使用cast函數。 也正是從oracle 9.2開始,内置資料類型date和timestamp在使用9i的jdbc驅動做查詢時,date被映射為java.sql.date,timestamp被映射為java.sql.timestamp。 從oracle11開始,其jdbc驅動程式又重新開始回歸為将内置類型date映射為java.sql.timestamp(正如9.2之前的那樣)。 

是以,時分秒精度的丢失與hibernate無關,是oracle jdbc驅動的問題。最好的解決辦法就是:

【1】換驅動。經測試,将最開始使用的10g的驅動ojdbc14.jar換為11g的驅動ojdbc5.jar後;

1.1:分别換應用web-info/lib目錄下和build path引用。

1.2:如果是部署伺服器應用還應當把was的配置改成ojdbc5.jar,具體截圖如下:

oracle10g擷取Date類型字段無時分秒解決辦法!
oracle10g擷取Date類型字段無時分秒解決辦法!

ps:${oracle_jdbc_driver_path}路徑指向在was-環境-websphere變量處可以看到具體伺服器配置路徑;

【2】資料庫中把

date 設為 timestamp 類型。