加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:15:42 所属栏目:MsSql教程 来源:网络整理
导读:declare @str_datetime varchar(50)set @str_datetime='30-04-2012 19:01:45' -- 30th April 2012declare @dt_datetime datetimeselect @dt_datetime=@str_datetime 这是给出以下错误: Msg 242,Level 16,State 3,Line 4 The conversion of a varchar data t
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.”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读