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转换?
解决方法
但是这里有一些例子来说明如何改变.
用户正在使用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.”