问题现象
最近在做公司新项目的时候遇到一个问题,在查询历史轨迹清单的时候总是比原始轨迹数据少了几个点,之前没有太过在意,觉得一天8000多个轨迹点,丢失几个不影响到业务与功能的正常使用。最近闲来无事针对这些小问题进行了逐一分析。虽然说不会影响到客户使用与体验,但是能让系统做的越来越完美使我们编程人员的追求。
查找问题原因
获取到前端传入的参数,我们通过sql server management studio执行以下我们的存储过程
按F11进行调试,调试过程中我发现了一个很严重的问题,如下图:
为什么我传入的时间明明是2018-10-09 15:59:59秒,调试进去却变成了10 10 2018 3:59PM,整整少了一分钟的时间,难道我传入的时间值在存储过程中都被转成了这样的时间格式,直接给我抹去了一分钟?我擦,这问题就严重了!然后我又试了几个存储过程,发现只有我在存储过程中使用EXEC进行了SQL语句的拼接,时间格式才会被转变,这下就好受了很多。
问题该怎么样处理呢?
既然是时间格式才会遭到转换,我不传时间格式不就行了嘛,但是考虑到改动与接口参数类型一致的原因,我在存储过程中进行了时间类型的转换,在拼接之前我先将时间类型转成字符串类型。
值得注意的是,因为我传入的时间精确到秒,所以这里是有了转换类型是120,根据自己对精确度的要求选择合适的转换类型。
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16 Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06 Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06 Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06 Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06 Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06 Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46 Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06 Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16 Select CONVERT(varchar(100), GETDATE(), 12): 060516 Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937 Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967 Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47 Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157 Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16 Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47 Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250 Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006 Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16 Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006 Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006 Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006 Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006 Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006 Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49 Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006 Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16 Select CONVERT(varchar(100), GETDATE(), 112): 20060516 Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513 Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547 Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49 Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700 Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827 Select CONVERT(varchar(100), GETDATE(), 130): 18 1427 10:57:49:907AM Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM
时间转换成字符串后再调试一下,效果如下
OK,达到了自己想要的结果,顺手赶紧将之前相类似的存储过程都修改了一遍。
其实我现在还有一个疑问,为什么使用拼接的存储过程使用EXEC 进行SQL语句拼接,时间类型就成了那个样子?难道是系统默认时间?不知道除了上述我的做法外还有没有更好的处理方式。
|