2009年5月18日 星期一

java/oracle日期處理

public class Test{
public static void main (String args []){
java.util.Date a = new java.util.Date();
System.out.println(a);
java.sql.Date b = new java.sql.Date(a.getTime());
System.out.println(b);
java.sql.Time c = new java.sql.Time(a.getTime());
System.out.println(c);
java.sql.Timestamp d=new java.sql.Timestamp(a.getTime());
System.out.println(d);
}
}

Mon Apr 03 18:00:34 CST 2006
2006-04-03
18:00:34
2006-04-03 18:00:34.388

1. oracle默認的系統時間就是sysdate函數,儲存的數據形如25-3-200510:55:33
2. java中取時間的對像是java.util.Date。
3. oracle中對應的時間對像是java.util.Date,java.sql.Time,java.sql.Timestamp、它們都是是java.util.Date的子類。
4. oracle中與date操作關係最大的就是兩個轉換函數:to_date(),to_char()。 to_date()一般用於寫入日期到數據庫時用到的函數。 to_char()一般用於從數據庫讀入日期時用到的函數。

DATE、TIME和TIMESTAMP:
SQL定義了三種與時間有關的數據類型:DATE由日、月和年組成。 TIME由小時、分鐘和秒組成。 TIMESTAMP將DATE和TIME結合起來,並添加了納秒域。
標準Java類java.util.Date可提供日期和時間信息。但由於該類包含DATE和TIME信息而沒有TIMESTAMP所需的納秒,因此並不與上述三種SQL類型完全相配。
因此我們定義了java.util.Date的三種子類。它們是:
1.有關SQL DATE信息的java.sql.Date
2.有關SQL TIME信息的java.sql.Time
3.有關SQL TIMESTAMP信息的java.sql.Timestamp
對於java.sql.Time,java.util.Time基本類的小時、分鐘、秒和毫秒域被設置為零。對於 java.sql.Date,java.util.Date基本類的年、月和日域被分別設置為1970年1月1日。這是在Java新紀元中的“零”日期。 java.sql.date中的日期可以和標準的SQL語句中含有日期的字段進行比較.java.sql.Timestamp類通過添加納秒域來擴展 java.util.Date。

oracle中兩個轉換函數:
1. to_date()作用將字符類型按一定格式轉化為日期類型:
具體用法:to_date(''2004-11-27'',''yyyy-mm-dd''),前者為字符串,後者為轉換日期格式,注意,前後兩者 要以一對應。如;to_date(''2004-11-27 13:34:43'', ''yyyy-mm-dd hh24:mi:ss'')將得到具體的時間。
2. to_char():將日期轉按一定格式換成字符類型:
具體用法:to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'')

to_date()與24小時製表示法及mm分鐘的顯示:
在使用Oracle的to_date函數來做日期轉換時,很多Java程序員也許會直接的採用“yyyy-MM-dd HH:mm:ss”的格式作為格式進行轉換,但是在Oracle中會引起錯誤:“ORA 01810格式代碼出現兩次”。
如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;
原因是SQL中不區分大小寫,MM和mm被認為是相同的格式代碼,所以Oracle的SQL採用了mi代替分鐘。 oracle默認的系統時間就是sysdate函數,儲存的數據形如2005-3-2510:55:33,java中取時間的對像是 java.util.Date。
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual

在java對oracle的操作中,對日期字段操作的例子:
表book中有name varchar2(20)//書籍名稱,buydate Date //購買日期兩個字段。
已經創建了數據庫連接Connection conn;

方法一、使用java.sql.Date實現比較簡單的yyyy-mm-dd格式日期。 java.sql.Date不支持時間格式。切記不要使用new java.sql.Date(int year,int month,int date),因為還要處理時間差問題。
PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");
java.sql.Date buydate=java.sql.Date.valueOf("2005-06-08");
pstmt.setString(1, "Java編程思想");
pstmt.setDate(2,buydate );
pstmt.execute();
方法二、使用java.sql.Timestamp,同上不使用new Timestamp(....)
PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");
java.sql.Timestamp buydate=java.sql.Timestamp.valueOf("2004-06-08 05:33:99");
pstmt.setString(1, "Java編程思想");
pstmt.setTimestamp(2,buydate );
pstmt.execute();
方法三、使用oracle的to_date內置函數
PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,to_date(?, 'yyyy-mm-dd hh24:mi:ss')");
String buydate="2004-06-08 05:33:99";
pstmt.setString(1, "Java編程思想");
pstmt.setString(2,buydate );
pstmt.execute();
附:oracle日期格式參數含義說明
d:一周中的星期幾
day:天的名字,使用空格填充到9個字符
dd:月中的第幾天
ddd:年中的第幾天
dy:天的簡寫名
iw: ISO標準的年中的第幾週
iyyy:ISO標準的四位年份
yyyy:四位年份
yyy,yy,y:年份的最後三位,兩位,一位
hh:小時,按12小時計
hh24:小時,按24小時計
mi:分
ss:秒
mm:月
mon:月份的簡寫
month:月份的全名
w:該月的第幾個星期
ww:年中的第幾個星期

source: http://blog.csdn.net/senmon2004/archive/2006/04/07/653936.aspx

沒有留言: