[数据库]oracle 日期类型字段的操作
在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: 年中的第几个星期
另一个例子:
package com.daqing.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import com.daqing.jdbc.JdbcUtils;
public class DateTest {
private static Connection conn = null;
private static PreparedStatement ps = null;
private static ResultSet rs = null;
public static void main(String[] args) throws SQLException {
/**
* new Date()表示获取当前时间
*/
//create("ydqhaha", new Date(), 501.0f);
Date date = read(13);
System.out.println(date);
}
/**
* Date型存入到数据库中
* @param name
* @param birthday
* @param money
* @throws SQLException
*/
public static void create(String name,Date birthday,float money) throws SQLException{
String sql = "insert into user(name,birthday,money) values(?,?,?)";
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setString(1, name);
/*
* 因为在业务逻辑从用的都是java.util.Date包
* java.sql.Date包是从java.util.Date包中继承的,把父类赋给子类是不行的。
* 获取java.util.Date中的当前时间
*/
ps.setDate(2, new java.sql.Date(birthday.getTime()));
ps.setFloat(3, money);
int i = ps.executeUpdate();
System.out.println(i);
}
/**
* 根据id查询生日,是时间字段的处理方法
* @param i
* @return
* @throws SQLException
*/
public static Date read(int i) throws SQLException{
Date birthday = null;
String sql = "select * from user where id=?";
conn = JdbcUtils.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, i);
rs = ps.executeQuery();
while(rs.next()){
/**
* java.sql.Date子类的Date赋值给父类java.util.Date是可以的
* 输出格式为:2010-08-15
*/
birthday = rs.getDate("birthday");
/**
* 也可以在这里进行转换,把java.sql.Date转为java.util.Date
* 输出格式为Sun Aug 15 00:00:00 CST 2010
*/
//birthday = new Date(rs.getDate("birthday").getTime());
}
return birthday;
}
}
mysql 日期查询
1.在mysql数据库中,如果我们要根据年月日,查询到我们想要的数据,那么像下面这样写就可以了。
select * from orderding where year(orderCreateDate)=2009 and month(orderCreateDate)=03
2.在jsp页面的编写过程中我们通常会遇到查询起始时间和查询截至时间,这个起始时间和截至时间也是对jsp页面复杂查询的一个应用。首先我们获取到的日期格式是这样的:2009-2-12或者2009-3-3或者2009-10-12,我们在组合sql语句的时候可以这样:(分了三个例子)
1> select * from user where birthday>'2009-2-3' and birthday<'2009-4-3'这样我们能够查到所有包括2009-2-3并且大于2009-2-3的所有的用户信息。
2> 如果我们是这样组合的select * from user where birthday>'2009-2-3'那么我们就会查到等于2009-2-3并且和大于2009-2-3号的所有信息。
3> 如果我们是这样的组合select * from user where birthday<'2009-2-3'那么我们会查询到包括2009-2-3并且小于2009-2-3的所有用户信息。
这里可能是mysql自己的一个实现机制,不用写=号,=号也包含在我们写的sql语句中了。并且在组合这个sql语句的时候要注意''的用法,如果省去了''那么我们就会吃大亏的。还有2009-2-3这个数值的获取在jsp中通常是request.getParameter("birthday").这样的
JDBC日期详解
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/** *//**
*
* @author oakertree
*
*/
public class TestJDBCDate {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
// new com.mysql.jdbc.Driver();
con = DriverManager.getConnection("jdbc:mysql://localhost:3307/test", "root", "admini");
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT * FROM time");
while(rs.next()) {
/**//*
Date d = rs.getDate("date");
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
System.out.println(sdf.format(d));
*/
/**//*
Time t = rs.getTime("time");
SimpleDateFormat sdf = new SimpleDateFormat("HH时mm分ss秒");
System.out.println(sdf.format(t));
*/
Date d = rs.getDate("datetime");
Time t = rs.getTime("datetime");
SimpleDateFormat sdfdate = new SimpleDateFormat("yyyy年MM月dd日");
SimpleDateFormat sdftime = new SimpleDateFormat("HH时mm分ss秒");
System.out.println(sdfdate.format(d) + sdftime.format(t));
/**//*
Timestamp dt = rs.getTimestamp("datetime");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
System.out.println(sdf.format(dt));
*/
//得到日期中的月
/**//*
Calendar c = Calendar.getInstance();
c.setTime(d);
System.out.println(c.get(Calendar.MONTH));
*/
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null) {
rs.close();
rs = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(con != null) {
con.close();
con = null;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**//*
+----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| date | date | YES | | NULL | |
| time | time | YES | | NULL | |
| datetime | datetime | YES | | NULL | |
+----------+----------+------+-----+---------+-------+
*/