2016-08-26 2 views
0

У меня есть 2 кнопки на моей веб-странице. И когда я нажимаю первую кнопку, системное время обновляется в starttime моей таблицы sql, и когда я останавливаюсь, время окончания должно быть обновлено, а разница между ними должна обновляться в таблице anothere. Я использую следующие запросы.Получение исключения с datetime diff

Чтобы обновить время окончания и обновить общее время.

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) at 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) при javax.servlet .http.HttpServlet.service (HttpServlet.java:648) в javax.servlet.http.HttpServlet.service (HttpServlet.java:729) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (приложение FilterChain.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) at 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) at org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:616) по адресу org.apache.catalina.cor e.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) в java.util.concurrent.ThreadPoolExecutor.runWorker (Unknown Source) в java.util.concurrent.ThreadPoolExe cutor $ Worker.run (Unknown Source) на org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) в java.lang.Thread.run (Unknown Source)

И исключение указывает на второй запрос, указанный в моем вопросе.

Если время меньше, скажем, как 2 минуты или 3 минуты, оно обновляется без каких-либо проблем.

пожалуйста, где я иду не так, и как я могу это исправить.

Моя Перерывы таблица выглядит ниже

enter image description here

Вместо нуль, то это должно быть конец времени запечатлен на кнопку мыши

и мое время трекер выглядит, как показано ниже.

enter image description here

вместо 4.97 в скриншоте выше должна быть сумма totalbreaktime от моего первого экрана.

Благодаря

+1

Насколько я могу сказать, что вы принимаете разницу между первым января 1900 года и некоторые даты. «датифик» может преодолевать только 68-летнюю стоимость секунд, см. https://msdn.microsoft.com/en-us/library/ms189794(v=sql.110).aspx. Поскольку вы все равно разделите на 60, почему бы не просто используйте 'lateiff (минуты, ...)' или переосмыслите то, что вы делаете вообще. –

+1

, поскольку количество секунд между 1 января 1900 года и текущей датой и временем составляет около 3 681 185 640. Это больше, чем 32-битное целое число, и функция 'lateiff' ограничена этим. –

+0

BTW: Я предлагаю вам также отправить 1) код с использованными значениями значений и 2) значения вставлены. –

ответ

0

Это потому, что DATETIME функционирует как DATEDIFF, DATEADD и т.д. принимает и возвращает целое число (INT) тип данных. Предел типа данных составляет 2^31 (-2,147,483,648) до 2^31-1 (2 147 483 647).

Так что если вы добавите -2147483648 в TotalBreakTime. Она возвращает "1948-08-08 14: 01: 46.000"

SELECT DATEADD(SS,CAST(-2147483648 AS BIGINT),'2016-08-26 17:15:54.000'); 

И чем больше предел тип данных возвращает ошибку.

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) 

Я бы предложил обсудить логику с вашей командой, решив проблему соответствующим образом.

Благодаря

0

попробовать это:

MERGE Time_Tracker as target 
    using 
    (SELECT USERID, 
     Sum(cast(cast(TotalBreakTime as float) 
       * 86400 as bigint)) ColumnWithBreaksCount 
    FROM BreaksTable b 
    Where datediff(day, StartTime, GETDATE()) = 0 
    GROUP BY USERID) source 
ON target.USERID = source.USERID 
WHEN MATCHED THEN UPDATE 
SET BREAKS = source.ColumnWithBreaksCount;" 
Смежные вопросы