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. jdbc读取mysql时分秒yyyy-mm-dd hh:_[转]JDBC中日期时间的处理技巧

    Java中用类java.util.Date对日期/时间做了封装,此类提供了对年.月.日.时.分.秒.毫秒以及时区的控制方法,同时也提供一些工具方法,比如日期/时间的比较,前后判断等. java.uti ...

  2. oracle sql比较时间大小,Oracle数据库中日期时间的操作比较和加减

    Oracle数据库中日期时间的操作比较和加减 Oracle关于时间/日期的操作 1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7 ...

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

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

  4. 语言 全排列 函数_Power Query 中日期时间格式转换需要了解的区域语言对照表

    不同的国家有不同的日期时间书写格式,比如: 多数亚洲国家:yyyy-MM-dd hh:mm 有些欧洲国家:dd.MM.yyyy HH:mm 极少数的国家:MM/dd/yyyy h:mm tt 还有各种 ...

  5. asp中日期时间函数介绍

    date() 获取日期,格式:2004-2-28 time() 获取时间,格式:22:24:59 now() 获取日期和时间 格式: 2005-5-2 22:37:30 d=date() 获取年份:y ...

  6. 数据库下午怎么插入_数据库中日期时间用法

    如有你有帮助,请购买下载,谢谢! 1 页 转一篇 oracle 日期时间用法的文章,十分有用! ---------------------------------------------------- ...

  7. php 中日期时间函数大全,PHP 中日期时间函数 date() 用法总结

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

  8. mysql中时间的储存方式_数据库 中“日期/时间”存储方式

    Access中: Access 在内部以 双精度浮点数的形式存储"日期/时间"值.每一个此类数值均包含日期和时间两部分.小数点左边的整数部分表示日期.小数点右边的小数部分表示时间. ...

  9. 关于Element UI中日期时间选择器在IE浏览器中初始化显示的兼容性问题

    一.简单说明 项目使用Vue+Element UI进行开发,使用了 DateTimePicker 日期时间选择器. 二.问题描述 打开修改对话框(进行选择日期操作可以正常显示),在谷歌浏览器中初始化时 ...

最新文章

  1. 基于云的CRM系统到底好在哪里?
  2. python调用通达信公式_对照通达信一些指标的Python实现
  3. 计算从ios照片库中选取的图片文件大小
  4. ABAP Authorization trace工具
  5. ASP.NET 生成唯一不重复的订单号 支持多用户并发、持多数据库的实现参考(C#.NET通用权限管理系统组件源码组成部分)...
  6. [转载] 如何在Android设备之间共享Google Play应用,音乐等
  7. Netty端口被占用问题
  8. python常用代码大全-Python常用库大全及简要说明
  9. [转]数据安全之SQL注入资料整理
  10. PyTips 0x14 - Python 描述符
  11. 计算判断两条线是否垂直,平行,相交,求相交点坐标
  12. 计算机网络考研知识点整理,计算机网络考研知识点
  13. 5G网络下,怎么打电话?
  14. 【Codewars】Pick peaks
  15. 什么是前端开发?什么是后端开发?
  16. 递归专题---[2]开根号
  17. one 主格 复数 宾格_主格、宾格、名词所有格
  18. oracle安装界面空白,在windows 2012中安装oracle 12c R2界面空白挂起无响应CPU达到100%的问题...
  19. 9.29 正睿提高6
  20. 高通平台开发系列讲解(充电篇)充电管理芯片PM7250B详解

热门文章

  1. 华为聚焦AI基础平台,加速行业智能化落地
  2. 搜狗CEO王小川:AI领域存在泡沫 但留下的是珍珠
  3. 清华 NLP 团队推荐:必读的77篇机器阅读理解论文
  4. SAP MM PIR里的Lower Limit Upper Limit
  5. 盘点丨春节假期里你错过的人工智能重要新闻
  6. 解密脑机接口:专访CMU生物医学工程系主任贺斌
  7. Nature展示迄今为止最详细的“人脑零部件清单”
  8. 语音助手再次敲响隐私保护警钟
  9. 超维计算让AI有记忆和反应,还能解决自动驾驶难题
  10. CES新观察:智能应用全面开花 “陆海空”新品值得关注