在JSP中的一段代码:
<%
String starttime=request.getParameter("starttime");
String endtime=request.getParameter("endtime");
String machineid=request.getParameter("select");SimpleDateFormat   smp   =   new   SimpleDateFormat("yyyy-MM-dd hh:mm:ss");   
Calendar   cdt1   =   Calendar.getInstance(); 
Calendar   cdt2   =   Calendar.getInstance(); 
cdt1.setTime(smp.parse(starttime));//starttime字符串时间转换为日期型
cdt2.setTime(smp.parse(endtime));//endtime字符串时间转换为日期型
//连接数据库
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dx-exam";
String usr="sa";
String pwd="sa";
Connection conn=DriverManager.getConnection(url,usr,pwd);
Statement stmt=conn.createStatement();String sql="select * from data where MachineId="+machineid+ "and CurrentTime BETWEEN "+cdt1+"and"+cdt2;.....%>
为什么报这样的错误:
javax.servlet.ServletException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]以 'time=1235002820000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset' 开头的 标识符 太长。最大长度为 128。
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:846)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)
org.apache.jsp.login3_005fview_jsp._jspService(login3_005fview_jsp.java:224)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

解决方案 »

  1.   

    id="Asia/Shanghai" 表的字段太长啦?
    把Asia/Shanghai 改一下看看咯!!!
      

  2.   

    String sql="select * from data where MachineId='"+machineid+ "' and CurrentTime BETWEEN "+cdt1+"and"+cdt2; 是字符串的话,加' '
      

  3.   

    怎么不使用java.sql.Time或java.sql.timestamp????
      

  4.   

    CurrentTime BETWEEN "+cdt1+"and"+cdt2 是date类型的话  应该用to_date('时间','yyyy-mm-dd') 转换一下  
      

  5.   

    建议 把在SQL 在数据库中跑一下, 确定没有错了再写到程序中。
      

  6.   

    <% 
     String starttime=request.getParameter("starttime"); 
    String endtime=request.getParameter("endtime"); 
    String machineid=request.getParameter("select"); DateFormat df = DateFormat.getDateTimeInstance(); 
    Date data1 = df.parse(starttime); 
    Date data2 = df.parse(endtime); Time t1 = new Time(data1.getTime()); 
    Time t2 = new Time(data2.getTime()); //连接数据库 
    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); 
    String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dx-exam"; 
    String usr="sa"; 
    String pwd="sa"; 
    Connection conn=DriverManager.getConnection(url,usr,pwd); 
    Statement stmt=conn.createStatement(); String sql="select * from data where MachineId= " + machineid + "and CurrentTime BETWEEN "+ data1+"and"+data2; ....... 
    %> 7楼的方法有点问题 
    我输入起始时间与终止时间如下: 
    2009-1-7 10:10:09 
    2009-1-7 10:20:09 

    运行报这样的错误: 
    javax.servlet.ServletException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]第 1 行: 'Jan' 附近有语法错误。 
      

  7.   

    组sql的日期类型直接用字符串就对了'08/08/2008'....这个问题我看是纯sql问题你在sql server客户短先调通了在说吧 
      

  8.   

    SQL里存储的数据都是这样的形式啊
    2009-1-7 10:10:09 
    2009-1-7 10:20:09 
    .
    .
    .
    .
    .
      

  9.   

    SimpleDateFormat  smp  =  new  SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
    这样,你用smp.parse(Date),如果输入的时间就是今天(2009/02/20 time)
    那么你得到的将是“2009-02-20 time”
    而你库里的如果是像你说的那种形式“2009-1-7 time”
    那么你对这两字符串比较是不会得到你想要的结果的~~~~对于你说的错误,你可以把你执行的SQL语句打出来,然后把它粘到数据库中执行一下这条语句
    这样会更方便定位错误所在~~
      

  10.   

        数据库的时间 和java里面的时间是不同的  
     你必须把你的时间转换成字符串才OK 
      你时间输出是:内似:Fri Feb 20 17:04:39 CST 2009
     所以你要转换一下  比如说:cdt1.getTime().toLocaleString();
    或者你自己用工具类转换一下才行 
      
         你可以去看看SQL的API你最后的字符串要是这样子的
    select * from data where MachineId='编号' and CurrentTime BETWEEN '2009-2-20' and '2009-2-21' 

    select * from data where MachineId='编号' and CurrentTime BETWEEN '2009-2-20 15:00:00' and '2009-2-21 5:30:00'
      还有  看你的编号好像不是INT类型的 如果有越界之类的错误的话 你可以试着先把你的编号类型改成INT  然后再看看你的结果是不是对应
    这样的话 基本上能解决问题
      

  11.   

        数据库的时间 和java里面的时间是不同的  
     你必须把你的时间转换成字符串才OK 
      你时间输出是:内似:Fri Feb 20 17:04:39 CST 2009
     所以你要转换一下  比如说:cdt1.getTime().toLocaleString();
    或者你自己用工具类转换一下才行 
      
         你可以去看看SQL的API你最后的字符串要是这样子的
    select * from data where MachineId='编号' and CurrentTime BETWEEN '2009-2-20' and '2009-2-21' 

    select * from data where MachineId='编号' and CurrentTime BETWEEN '2009-2-20 15:00:00' and '2009-2-21 5:30:00'
      还有  看你的编号好像不是INT类型的 如果有越界之类的错误的话 你可以试着先把你的编号类型改成INT  然后再看看你的结果是不是对应
    这样的话 基本上能解决问题
      

  12.   

    似乎是参数和and之间少了个空格
      

  13.   

    使用PreparedStatement
    setTimestamp(int parameterIndex, Timestamp x)
      

  14.   

    String sql="select * from data where MachineId='"+machineid+ "' and CurrentTime BETWEEN "+cdt1+"and"+cdt2; 是字符串的话,加' ' 
      

  15.   

    指定语句类型为  普通SQL语句 试试