当前位置: 代码迷 >> Sql Server >> 超难,非SQL高手请绕道,怎么防止服务器时间调整影响到客户端软件时长计算
  详细解决方案

超难,非SQL高手请绕道,怎么防止服务器时间调整影响到客户端软件时长计算

热度:63   发布时间:2016-04-24 09:32:34.0
超难,非SQL高手请绕道,如何防止服务器时间调整影响到客户端软件时长计算?
        近日下载到一个叫做“NiceMIS神算子”的游戏,用SQL事件探测器跟踪发现其时长计算办法很有参考意义,它是使用服务器时间计算时长的,可以防止多客户端电脑时间不统一问题,看起来很适合网络版软件使用。
       其SQL语句见后文,直接在查询分析器执行可返回计时时长(分秒钟,其中2014-11-14 16:27:10为开始时间)
      但有个问题:当开始时间被客户端记录下来后,如果服务器端时间发生调整(如同步Internet造成自动调整),那么时长计算将会出错。比如说:你刚接通电话时是12:00,而正在通话时,服务器向前调整5分钟,即变成12:05,那么这多出的5分钟话费岂不是要冤枉你了?
       现在的问题就是:怎样才能防止服务器调整时间影响到客户端软件时长计算?

Select 
 (Case When minCount<>0 then Cast(X.minCount as varchar)+'分' Else '' End)+
 (Case When secCount<>0 then Cast(X.secCount as varchar)+'秒' Else '' End)+
 (Case When ((X.minCount=0) Or (X.secCount=0))And(X.minCount+X.secCount<>0) Then '钟' Else '' End)
 as tempResultValue
From 
(Select datediff(second,'2014-11-14 16:27:10',Getdate())/60 as minCount,datediff(Second,'2014-11-14 16:27:10',Getdate())%60 as secCount
) X

------解决思路----------------------
引用:
Select 
 (Case When minCount<>0 then Cast(X.minCount as varchar)+'分' Else '' End)+
 (Case When secCount<>0 then Cast(X.secCount as varchar)+'秒' Else '' End)+
 (Case When ((X.minCount=0) Or (X.secCount=0))And(X.minCount+X.secCount<>0) Then '钟' Else '' End)
 as tempResultValue
From 
(Select datediff(second,'2014-11-14 16:27:10',Getdate())/60 as minCount,datediff(Second,'2014-11-14 16:27:10',Getdate())%60 as secCount
) X


两个问题 ,windows的系统时间是自动同步,还是手动修改这样的。
手动修改,可以通过cmd进行修改,从而让sql server 端时间差值获取变得容易些。 前端使用ajax同步即可。
如果是自动修改,需要在sql server端进行轮询,考虑到精度 ,基本就到秒级别了。用作业的方式轮询可能不是好的解决方法,需要windows端编程了。

另外,一个疑问,如果是绝对值考虑用时的话,可以使用计时方式,而不是前后时间差值方式。也就可以屏蔽与服务器端的绑定了。

lz 参考。 
------解决思路----------------------
一般的系统,客户端是有一个功能:同步服务器的时间(select getdate())更新自己
所以,服务器是不能乱改时间的了
------解决思路----------------------
引用:
        近日下载到一个叫做“NiceMIS神算子”的游戏,用SQL事件探测器跟踪发现其时长计算办法很有参考意义,它是使用服务器时间计算时长的,可以防止多客户端电脑时间不统一问题,看起来很适合网络版软件使用。
       其SQL语句见后文,直接在查询分析器执行可返回计时时长(分秒钟,其中2014-11-14 16:27:10为开始时间)
      但有个问题:当开始时间被客户端记录下来后,如果服务器端时间发生调整(如同步Internet造成自动调整),那么时长计算将会出错。比如说:你刚接通电话时是12:00,而正在通话时,服务器向前调整5分钟,即变成12:05,那么这多出的5分钟话费岂不是要冤枉你了?
       现在的问题就是:怎样才能防止服务器调整时间影响到客户端软件时长计算?

Select 
 (Case When minCount<>0 then Cast(X.minCount as varchar)+'分' Else '' End)+
 (Case When secCount<>0 then Cast(X.secCount as varchar)+'秒' Else '' End)+
 (Case When ((X.minCount=0) Or (X.secCount=0))And(X.minCount+X.secCount<>0) Then '钟' Else '' End)
 as tempResultValue
From 
(Select datediff(second,'2014-11-14 16:27:10',Getdate())/60 as minCount,datediff(Second,'2014-11-14 16:27:10',Getdate())%60 as secCount
) X



楼主可以采用标准网络时间,而不是服务器本地时间,通过授时服务器进行时钟记录和同步
------解决思路----------------------
你想太多了。
一台不关机的服务器假如一天一同步会有秒级的误差,这样的硬件根本不合格。更不要说5分钟的误差的。
如果碰上这样的设备,什么方案都白搭,在大误差的设备上根本算不出精确的时间。
  相关解决方案