使用datetime diff

时间:2016-08-26 14:18:52

标签: sql-server jdbc

我的网页上有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表格如下所示

enter image description here

而不是null,这应该是按钮点击时捕获的结束时间

我的时间跟踪器如下所示。

enter image description here

在上面的屏幕截图中,

而不是4.97,它应该是我第一次屏幕截图中totalbreaktime的总和。

由于

2 个答案:

答案 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.0​​00”

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