sql-server – SQL Server如何决定隐式datetime转换的格式?

前端之家收集整理的这篇文章主要介绍了sql-server – SQL Server如何决定隐式datetime转换的格式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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.”

原文链接:https://www.f2er.com/mssql/82853.html

猜你在找的MsSQL相关文章