设为首页 加入收藏

TOP

存储过程中使用Exec拼接SQL语句造成的时间格式转换问题
2018-10-23 18:08:45 】 浏览:56
Tags:存储 过程 使用 Exec 拼接 SQL 语句 造成 时间 格式 转换 问题

问题现象

最近在做公司新项目的时候遇到一个问题,在查询历史轨迹清单的时候总是比原始轨迹数据少了几个点,之前没有太过在意,觉得一天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语句拼接,时间类型就成了那个样子?难道是系统默认时间?不知道除了上述我的做法外还有没有更好的处理方式。希望有哪位大牛看到此博客后能告诉小弟一下。


编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇合并不同服务器的数据表(thinkph.. 下一篇Elasticsearch在使用Kibana查询时..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }