declare @str_datetime varchar(50)
set @str_datetime='30-04-2012 19:01:45' -- 30th April 2012
declare @dt_datetime datetime
select @dt_datetime=@str_datetime
这是给出以下错误:
Msg 242,Level 16,State 3,Line 4 The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
我的问题是SQL Server如何决定使用哪种格式进行隐式datetime转换?
解决方法
这可能取决于各种因素 – 操作系统的区域设置,当前用户的语言和日期格式设置.默认情况下,Windows使用美国英语,用户的设置是美国英语和MDY.
但是这里有一些例子来说明如何改变.
用户正在使用BRITISH语言设置:
-- works:
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME,'30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME,'04/13/2012');
GO
(错误)
Msg 242,Line 5 The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
用户正在使用Fran?ais:
-- works:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME,Line 1 La conversion d’un type de données varchar en type de données datetime a créé une valeur hors limites.
用户再次使用Fran?ais:
SET LANGUAGE FRENCH;
-- fails (proving that,contrary to popular belief,YYYY-MM-DD is not always safe):
SELECT CONVERT(DATETIME,'2012-04-30');
GO
(错误)
Msg 242,Line 1 La conversion d’un type de données varchar en type de données datetime a créé une valeur hors limites.
用户正在使用DMY代替MDY:
SET LANGUAGE ENGLISH;
SET DATEFORMAT DMY;
-- works:
SELECT CONVERT(DATETIME,'04-30-2012');
GO
(错误)
Msg 242,Line 2 The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
您最好的选择是始终使用ISO标准,非区域,安全,明确的日期格式.我通常推荐的是:
YYYYMMDD - for date only.
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time,and yes that T is important.
这些都不会失败:
SET DATEFORMAT MDY;
SET LANGUAGE ENGLISH;
SELECT CONVERT(DATETIME,'20120430');
SELECT CONVERT(DATETIME,'2012-04-30T19:01:45');
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME,'2012-04-30T19:01:45');
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME,'2012-04-30T19:01:45');
SET DATEFORMAT DMY;
SELECT CONVERT(DATETIME,'2012-04-30T19:01:45');
因此,我强烈建议您不要让用户输入自由文本日期格式(或者您自己使用不可靠的格式),而是控制输入字符串,并确保它们符合以下安全格式之一.那么用户拥有的设置或底层区域设置是什么,您的日期将永远被解释为他们打算的日期.如果您正在让用户在表单上的文本字段中输入日期,请??停止执行此操作并实施日历控件或至少一个选择列表,以便最终控制传回SQL Server的字符串格式.
有些背景,请阅读Tibor Karaszi的“The ultimate guide to the datetime datatypes”和我的帖子“Bad Habits to Kick : Mis-handling date / range queries.” (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|