Java中用类java.util.Date对日期/时间做了封装,此类提供了对年、月、日、时、分、秒、毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后判断等。
java.util.Date中采用一个long型的数来保存日期/时间,它表示从格林威治时间1970年1月1日00点00分00秒至今的毫秒数。
JDBC中,在这个类的基础之上扩展了3个类:java.sql.Date,java.sql.Time,java.sql.Timestamp。
java.sql.Date表示日期,只包括年月日;
java.sql.Time表示时间,只包括时分秒;
java.sql.Timestamp表示时间戳,包括年月日,时分秒,还有毫秒和纳秒;值得注意的是它比java.util.Date还多了一个纳秒。

这3个类分别对应数据库的3种数据类型:
java.sql.Date 日期(只包括年月日)
java.sql.Time 时间(只包括时分秒)
java.sql.Timestamp 日期/时间(包括年月日,时分秒,还有毫秒和纳秒)

有了上面的一些基础知识,下面介绍一些处理技巧。

1.对于数据库种不同的时间类型,要分别采用与之相对应的Java包装类来存取;
日期类型用java.sql.Date,时间类型用java.sql.Time,日期/时间类型用java.sql.Timestamp;
这里举个例子:假设要从oracle中获取系统时间,需要执行sql:select sysdate from dual,然后在通过ResultSet获取查询结果时,一定要调用方法:getTimestamp(),这样才可以把年月日时分秒都取出来,调用getDate()只能取出年月日,调用getTime()只能取出时分秒。
调用getString也可以取出来,但是存在问题,见技巧2。

2.尽量不要调用getString()来获取日期/时间类型的数据;
调用getString()也可以取出时间类型的数据,JDBC在内部将日期/时间转换为字符串;但是这个字符串的格式却取决于数据库,用Oracle是一种,用Sybase又是一种,mysql又是一种,如果你想兼容多种数据库,还是不要用getString()的好。
另外,采用字符串来保存时间存在一些问题,我在另外一篇帖子中解释过(见:Java中日期/时间的使用技巧【原创】);
还有是效率问题,用getString()需要在内部将日期时间转换为字符串,涉及字符串处理;但用getTimestamp()只需要做整数的运算和处理;而整数的运算处理一般都比字符串处理效率高。

3.如何将JDBC的日期/时间类型转换为字符串;
曾经看到过有人这样写:
java.sql.Timestamp timeStamp = //通过数据库访问获取到该数据
java.util.Date utilDate = new java.util.Date(timeStamp.getTime());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(utilDate);

这样也可以达到最终目的,但是有点问题,java.sql.Timestamp是继承java.util.Date的,因此format的时候直接传入timeStamp即可,没有必要临时创建一个utilDate。像下面这样就可以了:
java.sql.Timestamp timeStamp = //通过数据库访问获取到该数据
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = sdf.format(timeStamp);

如果是java.sql.Date或java.sql.Time,也是同样的道理。

4.在做select、update或insert时,如果某个字段为日期/时间类型,最好用PreparedStatement,而不要采用Statement
经常会看到这样的程序:
Connection conn;//前面的步骤略
Statement stmt = conn.createStatement();
stmt.execute("insert into tab ( begin_date ) values ( TO_Date( '06/27/2005 12:59:52', 'MM/DD/YYYY HH24:MI:SS'))");

熟悉oracle的人都知道,TO_Date是oracle里的函数,其他数据库没有,即使有也很可能不一样。那么这段代码只能用在oracle上,如果换成其他数据库,程序就无法执行了。

如果采用PreparedStatement,代码是这样:
Connection conn;//前面的步骤略
PreparedStatement pstmt = conn.prepareStatement("insert into tab ( begin_date ) values( ?)");
pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
pstmt.execute();
可以看出来,这段代码与数据库无关,只要是支持标准sql的数据库都没有问题。
客户是上帝,想用什么数据库,我们就得支持什么数据库,为了避免以后的麻烦,还是用PreparedStatement的好。

5.存储过程的参数,该用日期/时间类型的就要用,不要一味的都采用字符串型
我发现电信部里几乎所有存储过程,只要是日期/时间,都采用字符串类型(varchar2或其它)。这样会造成很多麻烦。
首先,需要约定字符串格式,调用者和被调用者都必须遵循这个格式,这种约定很容易受人为因素影响;
其次,存储过程中需要对字符串做分析,合法性检查等,增加了编码的难度和负责度;
再者,这些额外的代码,降低的程序的效率,增加了数据库的负担。

采用日期/时间类型来作为存储过程的参数,可以降低编码的难度,从逻辑上看起来更清晰,而且运行效率高。
在JDBC中采用CallableStatement来调用存储过程,对日期/时间的输入和输出,可以采用setTimestamp,getTimestamp,setDate,getDate,setTime,getTime。

6.java.sql.Timestamp如何转换为java.util.Date?
java.sql.Timestamp是java.util.Date的子类,不需要做任何转换直接赋值即可:
java.sql.Timestamp ts;
java.util.Date utilDate;
utilDate = ts;

java.sql.Date和java.sql.Time也是一样的道理。

7.java.util.Date如何转换为java.sql.Timestamp?
java.util.Date是java.sql.Timestamp的父类,不能像技巧6那样做了。要这样:
java.sql.Timestamp ts;
java.util.Date utilDate;
ts.setTime(utilDate.getTime());

java.sql.Date和java.sql.Time也是一样的道理。

[转]JDBC中日期时间的处理技巧的更多相关文章

  1. 【Java 与数据库】JDBC中日期时间的处理技巧

    JDBC中日期时间的处理技巧 详谈Java.util.Date和Java.sql.Date 基础知识 Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒 ...

  2. sql语句中日期时间格式化查询

          今天在做会员管理系统搜索时,我发现以前的搜索时间方式不太科学,效率也不是太高.由其是在查询指定的时间相等的时候,我在数据库中都存这样的时间格式"2007-5-22 14:32:1 ...

  3. Oracle 数据库中日期时间的插入操作

    Oracle 中如何插入日期时间类型的数据,首先为了演示, 新建数据表如下 create table t( mydate date); 插入日期时间 SQL> insert into t val ...

  4. PHP中日期时间函数date()用法总结

    date()是我们常用的一个日期时间函数,下面我来总结一下关于date()函数的各种形式的用法,有需要学习的朋友可参考. 格式化日期date() 函数的第一个参数规定了如何格式化日期/时间.它使用字母 ...

  5. Java中日期时间API小结

    Java中为处理日期和时间提供了大量的API,确实有把一件简单的事情搞复杂的嫌疑,各种类:Date Time Timestamp Calendar...,但是如果能够看到时间处理的本质就可以轻松hol ...

  6. FineReport中日期时间函数使用总结

    说明:凡函数中以日期作为参数因子的,其中日期的形式都必须是yy/mm/dd.而且必须用英文环境下双引号(" ")引用. DATE DATE(year,month,day):返回一个 ...

  7. Sql Server中日期时间格式化为字符串输出

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  8. JDBC中的时间处理

    MySQL中常用的时间类有: java.sql.Date, Time, Timestamp 用的比较多的是ava.sql.Date和TimeStamp: 先看表结构 CREATE TABLE `t_u ...

  9. 关于bat中日期时间字符串的格式化

    在其他编程语言中,要实现日期时间字符串的格式化,包括时间计算,都是比较简单的 但在bat或者说cmd.dos中要实现这些功能.还是有一定难度的 首先,windows的cmd中可以使用%date%表示日 ...

随机推荐

  1. C#基础----Linq之List<T>篇

    最近有用到List处理排序以及分页的问题.想想还是写一个博客记录一下.以下围绕Person类实现,Person类只有Name和Age两个属性   一.List<T>排序 1.1 List& ...

  2. 用css画图标

    css3的属性 transform(转换) 用途很广泛,功能也很强大,为了熟悉它的各种转换方式(平移 translate,旋转 rotate,扭曲 skew,放缩 scale),我做了一些平常常用的一 ...

  3. 模版(template)

    模版(template) 在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字 ...

  4. save()、saveOrUpdate()、merge()的区别

    一.Save() save()方法能够保存实体到数据库.假如两个实体之间有关系(例如employee表和address表有一对一关系),如果在没有事务的情况下调用这个方法保存employee这个实体, ...

  5. python pyperclip模块的使用

    用途: 复制,粘贴 用法: >>> import pyperclip >>> pyperclip.copy('Hello world!') >>> ...

  6. VS Code

    VS Code VS Code(Visual Studio Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.几乎完美的编辑器. 官网:https://code.visualstudi ...

  7. 命令行构建Unity项目

    自动任务构建 通常可以在桌面双击 Unity 图标,启动程序,但是,也可以通过命令行(例如,MacOS 终端或 Windows Command 窗口)运行程序.若使用这种方式启动 Unity,它将可以 ...

  8. Discuz论坛搬家手记(X3.2版本)

    Discuz论坛搬家手记(X3.2版本) 客户在虚拟主机上 运行着一个DISCUZ论坛, 主机商限制太多,连MP3都不让放,客户准备是在上面放一个FLASH斗地主游戏的(多人联机版), 加上MYSQL ...

  9. .NET Framework 中的所有类型

    .NET Framework 中的所有类型不是值类型就是引用类型. 值类型是使用对象实际值来表示对象的数据类型. 如果向一个变量分配值类型的实例,则该变量将被赋以该值的全新副本. 引用类型是使用对对象 ...

  10. 15个nosql数据库

    1.MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案.当数据量达到50GB以上 ...