我的网页上有2个按钮。当我点击第一个按钮时,系统时间会在我的sql表的starttime
中更新,当我停止时,必须更新结束时间,并且应该在另一个表中更新两者之间的差异。我使用了以下查询。
更新结束时间并更新总时间。
update breakstable set endtime = ?, TotalBreakTime = (? - StartTime) where userid = ?
and endtime is NULL
此处首先2 ?
s表示发生的按钮点击,另一个?
表示已从会话中捕获登录的userId。
使用totalbreaktime
的总和更新另一个表。
MERGE Time_Tracker as target using (SELECT USERID, CONVERT(NUMERIC(10,2),
SUM(DATEDIFF(Second, '19000101', TotalBreakTime))/60.0) as ColumnWithBreaksCount FROM
BreaksTable where CONVERT(Date, StartTime) = CONVERT(Date, GETDATE()) GROUP BY USERID)
as source ON target.USERID = source.USERID WHEN MATCHED THEN UPDATE
SET BREAKS = source.ColumnWithBreaksCount;"
问题:
我开始我的时间,休息一下,然后在一个半小时后返回,然后按下停止按钮。它没有更新表格,而是给我下面的例外。
com.microsoft.sqlserver.jdbc.SQLServerException:datediff 功能导致溢出。分开的日期部分的数量 两个日期/时间实例太大。尝试使用较少的约会 精确的日期部分。
和JDBC异常(对于Java人员)如下所示。
com.microsoft.sqlserver.jdbc.SQLServerException:datediff函数 导致溢出。分隔两个的日期部分的数量 日期/时间实例太大。尝试使用较少的约会 精确的日期部分。在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement $ PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:306) 在 org.DAO.UpdateEndTimeDAO.UpdateEndTimeDetails(UpdateEndTimeDAO.java:48) 在org.servlet.UpdateEndTime.doPost(UpdateEndTime.java:38)at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)at at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)at at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在Filter.MyFilter.doFilter(MyFilter.java:58)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 在 org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:673) 在 org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1500) 在 org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1456) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source) 在 org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61) 在java.lang.Thread.run(未知来源)
异常指向我问题中声明的第二个查询。
如果时间较短,比如2分钟或3分钟,则更新时没有任何问题。
请问我哪里出错了,我该怎么办呢。
My Breaks表格如下所示
而不是null,这应该是按钮点击时捕获的结束时间
我的时间跟踪器如下所示。
在上面的屏幕截图中,而不是4.97
,它应该是我第一次屏幕截图中totalbreaktime
的总和。
由于
答案 0 :(得分:0)
这是因为DATETIME函数如DATEDIFF,DATEADD等接受并返回整数(INT)数据类型。数据类型的限制是2 ^ 31(-2,147,483,648)到2 ^ 31-1(2,147,483,647)。
因此,如果您向TotalBreakTime添加-2147483648。它返回“1948-08-08 14:01:46.000”
SELECT DATEADD(SS,CAST(-2147483648 AS BIGINT),'2016-08-26 17:15:54.000');
更多数据类型的限制返回ERROR。
Arithmetic overflow error converting expression to data type int.
因为查询中的日期之间的第二个日期差异太大(超出数据类型的限制)。它返回错误。
SELECT CONVERT(NUMERIC(10,2),
SUM(CAST(DATEDIFF(Second, '19000101', '2016-08-26 17:15:54.000') AS BIGINT))/60.0)
我建议与你的团队讨论逻辑,相应地解决问题。
由于
答案 1 :(得分:0)
试试这个:
06-Jun-2004