为何你SQL Server中SQL日期转换出错了呢?

开发人员有时候使用相似下面SQL将字符串转换为日期时间类型,乍一看,这样的SQL的写法是没有什么问题的。可是这样的SQL其实有时候就是一个定时炸弹,随时可能出现问题(),下面简单对这种状况进行一个简单归纳。数据库

 

SELECT  CONVERT(DATETIME, '2020-01-13 6:46:42');

 

 

若是你将链接数据库的登陆名的默认语言修改成Aribc,而后去执行上面SQL语句,就会遇到错误,为何呢?session

 

clip_image001

 

 

为何上面SQL的日期转换出错了呢?实际上是由于登陆名修改默认语言后,会话对应的date_format变化了,从mdy变成了dmy,因此上面转换就报错了,有时候不报错,可是可能转换成一个错误日期,产生了逻辑错误,这个反而是一个跟糟糕的隐性错误。等你发现的时候,可能已经产生大量错误数据了。app

 

SELECT  session_id
       ,program_name
       ,client_interface_name
       ,language
       ,date_format
FROM    sys.dm_exec_sessions
WHERE   session_id = 53;

 

clip_image002

 

关于不一样语言的默认date_format,可使用下面命令查看:spa

 

sp_helplanguage 'us_english'code

 

 

另一种状况,若是当前会话使用SET命令修改过DATEFORMAT,也会遇到这个错误,以下所示:orm

 

SET DATEFORMAT DMY;
GO
SELECT  CONVERT(DATETIME, '2020-01-13 6:46:42');

 

clip_image003

 

 

这种状况就比较复杂了,有多是某一段SQL里面设置了DATEFORMAT,致使整个会话后面的日期格式所有变化了。因此上面这种SQL的健壮性就比较差,在平时就要避免写出这样的SQL,若是你使用这样的SQL,无论是会话的默认语言变化了,仍是当前会话的DATEFORMAT变化了,都不会产生错误或逻辑错误。blog

 

SELECT CONVERT(DATETIME,'2020-01-13 6:46:42', 120)ip

 

 

平时遇到这种日期转换,就必定要明确指定转换格式,让其不要受会话的DATEFORMAT变化影响,书写健壮、可靠的SQL语句,下面这两个简单SQL的细微差异,也可判别一我的是否用有书写健壮性SQL的意识!ci

 

 

SELECT  CONVERT(DATETIME, '2020-01-13 6:46:42');开发

 

SELECT  CONVERT(DATETIME, '2020-01-13 6:46:42', 120)

相关文章
相关标签/搜索