java.sql.SQLException: 在值“50:51:05”中,java.sql.Time 类型的小时值“50”非法。

5
当我尝试从MySQL中检索时间并将其设置为JLabel时,会出现错误。

java.sql.SQLException: Illegal hour value '50' for java.sql.Time type in value '50:51:05.

有人能建议我如何解决这个问题吗?
以下是代码。
        String sql = "SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(ot)))"
                + " FROM attendance"
                + " WHERE department = '"+department+"'"
                + "   AND date BETWEEN '"+dateChooser1+"' AND '"+dateChooser2+"'";
        st = con.createStatement();
        rst = st.executeQuery(sql);
        if(rst.next())
        {
            String time = rst.getString(1);
            oTimeTemp.setText(time);
        }

3
“时间”和“持续时间”是有区别的 - 此外,您应该查看“使用预处理语句”(https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html) - MadProgrammer
1
time_to_sec 函数接受一个时钟时间(即一天中的时间)。一天中没有50小时。 - MarsAtomic
2
你能否发布完整的堆栈跟踪 异常来自代码的哪一行?无论如何,我认为你应该只是使用 select sum(time_to_sec(ot))) from /* etc */ 并在 Java 中以某种方式处理秒数的总和。 - Ole V.V.
@MarsAtomic 这并不是完整的解释,因为MySQL时间值可以达到“838:59:59”。 - Ole V.V.
1
@HansanaAthukorala 时间和持续时间是有区别的,“50:51:05”不是一个有效的时间。 - MadProgrammer
显示剩余3条评论
3个回答

2

我解决了。以下是代码:

String sql = "SELECT SUM(TIME_TO_SEC(ot))"
            + " FROM attendance"
            + " WHERE department = '"+department+"'"
            + " AND date BETWEEN '"+dateChooser1+"' AND '"+dateChooser2+"'";
    st = con.createStatement();
    rst = st.executeQuery(sql);
    if(rst.next())
    {
            String time = rst.getString(1);
            Double dTime = Double.valueOf(time);
            int intTime = (int) dTime.doubleValue();
            String nTime = calculateTime(intTime);
            oTimeTemp.setText(nTime);
    }

private static String calculateTime(int totalSecs)
{
    int hours = totalSecs / 3600;
    int minutes = (totalSecs % 3600) / 60;
    int seconds = totalSecs % 60;

    String timeString = String.format("%02d:%02d:%02d", hours, minutes, seconds);
    return timeString;
}

为什么要这样做呢?最简单的解决方案是删除SEC_TO_TIME转换,只返回总秒数,并在Java代码中将其转换为持续时间 - Jim Garrison
@JimGarrison,那么你在问什么? - H Athukorala
2
很高兴我的建议起作用了。这段代码可能还可以进一步改进,例如通过使用java.time中的Duration - Ole V.V.
1
@OleV.V. 是的。非常感谢您提供的解决方案。它起作用了。 - H Athukorala

1

有一个mysql的bug,使用以下方式可以正常工作:

 String sql = "SELECT concate(SEC_TO_TIME(SUM(TIME_TO_SEC(ot))),'')"
 + " FROM attendance"
 + " WHERE department = '"+department+"'"
 + "   AND date BETWEEN '"+dateChooser1+"' AND '"+dateChooser2+"'";

-1
// if you want to use time as label  
// you can use oTimeTemp if Date type of java.util, this have both time and date

    if(rst.next())
        {
// this Time string need to cast  in util time
           String time = rst.getString(1);  
           String time = time ;
           DateFormat sdf = new SimpleDateFormat("hh:mm:ss");
           Date date = sdf.parse(time);
           oTimeTemp.setText(date); // in this date we have the time
        }

3
不起作用,一直出现错误。不过还是谢谢你的回答。 - H Athukorala
你想要做什么? - Amit Singh
3
请不要教导年轻人将过时且麻烦的SimpleDateFormat类作为首选,而且毫无保留地使用。现在我们有了更好的替代方案,即java.time,Java现代日期和时间API - Ole V.V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接