Java中的Date Time 与SQL Server 2005里的Datetime 之间的交互

Preface

Environment:
Platform: Windows XP
Language: Java 1.5
IDE: MyEclipse 6.0.1
Database: SQL Server 2005 Enterprise en

Introduction

本文主要讲述Java中的Date Time 与SQL Server 2005里的Datetime 如何进行交互。涉及到的Date Type有
java.util.Date
java.sql.Date
java.sql.Time
java.sql.Timestamp

Section 1 - java.util.Date

经过一些testing,大概了解了这几个类的实际用法与限制。

java.util.Date create 的instance 是不能直接让JDBC 存到DB的,它会出现如下Exception:
Conversion failed when converting datetime from character string.

要将java.util.Date存到DB必须经过 type conversion成为sql下的Date,Time或Timestamp。

Section 2 - java.sql.Date

java.sql.Date只能将date存到DB,time将被截取而由DB中最小的time值(00:00:00)所取代。

Code:
  java.util.Date currentDateTime = new java.util.Date();
  System.out.println(currentDateTime);
  System.out.println(currentDateTime.getTime());
  Date currentDate = new Date(currentDateTime.getTime());
  System.out.println(currentDate);
  System.out.println(currentDate.getTime());
  String strSQL = "insert into TestDateTime values(‘"+currentDate+"‘)";
  executeHelper(strSQL);

Console Output:
Tue May 20 15:51:48 CST 2008
1211269908671
2008-05-20
1211269908671

Datebase Output:
2008-5-20 0:00:00

从result可以看出java.sql.Date实际并不是在其instance中就截取time,因为得到的Long值仍然跟java.util.Date的Long值一样,只是在显示输出或者对DB操作时才截去tIme的输出。0:00:00是由DB其System的最小time补充的。

Section 3 - java.sql.Time

java.sql.Time只能讲time存到DB,date将被截取而由DB中最小的date值(1900-1-1)所取代。

Code:
  java.util.Date currentDateTime = new java.util.Date();
  System.out.println(currentDateTime);
  System.out.println(currentDateTime.getTime());
  Time currentTime = new Time(currentDateTime.getTime());
  System.out.println(currentTime);
  System.out.println(currentTime.getTime());
  String strSQL = "insert into TestDateTime values(‘"+currentTime+"‘)";
  executeHelper(strSQL);

Console Output:
Tue May 20 16:03:52 CST 2008
1211270632312
16:03:52
1211270632312

Datebase Output:
1900-1-1 16:03:52

从result可以看出java.sql.Time实际并不是在其instance中就截取date,因为得到的Long值仍然跟java.util.Date的Long值一样,只是在显示输出或者对DB操作时才截去date的输出。1900-1-1是由DB其System的最小date补充的。

Section 4 - java.sql.Timestamp

java.sql.Timestamp可以将date和time都存到DB。

Code:
  java.util.Date currentDateTime = new java.util.Date();
  System.out.println(currentDateTime);
  System.out.println(currentDateTime.getTime());
  Timestamp currentTimestamp = new Timestamp(currentDateTime.getTime());
  System.out.println(currentTimestamp);
  System.out.println(currentTimestamp.getTime());
  String strSQL = "insert into TestDateTime values(‘"+currentTimestamp+"‘)";
  executeHelper(strSQL);

Console Output:
Tue May 20 16:24:40 CST 2008
1211271880796
2008-05-20 16:24:40.796
1211271880796

Datebase Output:
2008-5-20 16:24:40

从result可以看出java.sql.Timestamp的存储格式跟java.util.Date的不同,Timestamp的格式是专门对DB操作所定义的规范化格式,也就是说DB只能接收到这种格式传过来的值,这也可以大概知道为什么java.util.Date为什么不能直接传值给DB了。

时间: 2024-08-02 02:45:19

Java中的Date Time 与SQL Server 2005里的Datetime 之间的交互的相关文章

(转) 如何向SQL Server 2005中插入中文

如何向SQL Server 2005中插入中文? 向SQL Server 2005中插入中文数据后,查询出来的结果是???,根本就不显示中文 解决方法: 1 关于数据库排序规则,将SQL_Latin1_General_CP1_CI_AS改成Chinese_PRC_CI_AS ,看一下是否可以解决这个问题,可惜我不能直接操作数据库,测试不了! 修改数据库的排序规则命令: alter   database   [databasename]  COLLATE   Chinese_PRC_CI_AS 2

存储过程系列之调试存储过程 SQL Server 2005

在数据库中直接调试  在数据库中直接调试是调试SQL Server 2005的存储过程的最简单的方法. 在Visual Stuido的IDE中你可以选择单步执行存储过程,然后就可以一条语句一条语句地单步执行了,同时你也可以检查和修改存储过程内的T-SQL变量和参数.本文结尾处提供下载的压缩包中包括一个SQL Server 2005 Express版本的Northwind数据库.我在其中添加了一个名为“DoThings”的存储过程,它有一个参数@CategoryID.这是一个没什么实用价值的存储过

(转)SQL server 2005查询数据库表的数量和表的数据量

本文转载自:http://hi.baidu.com/ajyajyajy/item/4e2a7f4dc83393d2c1a592c1 use DBNAMEgoselect * from sysobjects where xtype='U'; --这是查询所有表的信息select count(*) from sysobjects where xtype='U' --这是查询表的数量 ‍select a.name, b.rows from sysobjects a with(nolock) join

java连接Sql server 2005

最近在做老师布置的SQL Server大作业,其中有一道题就是用java连接SQL Server.以前连接数据库都是在MyEclipse中完成的.这次我换用记事本连接.下面是我的步骤: 1.首先,下载java连接SQL Server的驱动:sqljdbc 2.解压之后,找到sqljdbc.jar的所在位置,我的是:D:\Program Files (x86)\sqljdbc\sqlDriver\sqlDriver 3.配置环境变量:在系统的classpath中将sqljdbc.jar的文件位置添

Java如何实时的监控sql server 2005 表的操作

过程描述: 用户发送短信"A"到12329,发送记录会存储在sql server 2005 的记录表T 中,我们需要做的就是根据用户发送的代码"A"给用户返回相应的信息.如图: 考虑过使用触发器,可惜sql server 触发器不能够像Oracle 那样执行Java代码: 考虑使用程序不间断地扫描表,频繁的访问数据库又担心会对sql server 数据库产生太大的压力 各位oscer们,有没有什么好的解决办法?

SQL Server 2005中的分区表(六):将已分区表转换成普通表

在前面,我们介绍过怎么样直接创建一个分区表,也介绍过怎么将一个普通表转换成一个分区表.那么,这两种方式创建的表有什么区别呢?现在,我又最新地创建了两个表: 第一个表名为Sale,这个表使用的是<SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?>中的方法创建的,在创建完之后,还为该表添加了一个主键. 第二个表名Sale1,这个表使用的是<SQL Server 2005中的分区表(三):将普通表转换成分区表>中的方法创建的,也就是先创建了

SQL Server 2005中更改sa的用户名和密码

修改数据库SA账号名称的代码如下: 代码如下: Alter LOGIN sa DISABLE Alter LOGIN sa WITH NAME = [systemAccount] "systemAccount" 为SA的新名称,执行完成后刷新一下右侧登录名即可看到修改成功的账号名称. SQL Server 2005修改sa用户密码的方法图文版 一.修改SQL Server 2005中sa用户密码的方法 1. 点击"开始 - 所有程序 - Microsoft SQL Serve

SQL Server 2005中的分区表(四):删除(合并)一个分区

在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里.具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1). 第2个小表:2010-1-1(包含2010-1-1)到2010-12-31之间的数据. 第3个小表:2011-1-1(包含2011-1-1)到2011-12-31之间的数据. 第4个小表:2012-1-1(包含2012-1-1)到2012-12-31之间的数据. 第5个小表:2013-1-1(包含2013-1-

SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?(转)

如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的问题.当然数据表中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区表了.如果非要我说一个数值的话,我认为是100万条. 2.但是,数据多了并不是创建分区表的惟一条件,哪怕你有一千万条记录,但是这一千万条记录都是常用的记录,那么最好也不要使用分区表,说不定会得不偿失.只有你的数据是分段