每当 SQL Server 看到明确的 Year 候选者时,它将始终用作 Year。
其余 DM 部分由 DMY 设置或转换格式中的顺序确定。如果那不是真的,那么非常简单的转换就会崩溃。
例子
set dateformat dmy
select 1 a,CONVERT(datetime, '1-2-3') b
union all
select 2,CONVERT(datetime, '2001-2-3')
union all
select 3,CONVERT(datetime, '2001-3-2')
输出
a b
----------- -----------------------
1 2003-02-01 00:00:00.000
2 2001-03-02 00:00:00.000
3 2001-02-03 00:00:00.000
第 2 和第 3 明确将年份放在前面,没关系
编辑
在线图书有这个说法http://msdn.microsoft.com/en-us/library/ms180878.aspx#StringLiteralDateandTimeFormats
SET DATEFORMAT 有很多例外,无论转换的第三个参数如何,它都会起作用。
- SET DATEFORMAT 会话设置不适用于全数字日期条目
- 此 [ISO 8601] 格式不受登录默认语言设置的 SET DATEFORMAT、SET LANGUAGE 的影响。
- 当您以字母形式指定月份时,不会应用 SET DATEFORMAT 会话设置。
- ETC
要专门验证 dd/mm/yyyy,请改用以下内容
set dateformat dmy
declare @input varchar(10) set @input = '12-2010-01'
-- convert allows the date through
select convert(datetime, @input, 103) -- 2010-01-12 00:00:00.000
-- the case below returns 0 { = invalid date }
-- this uses 8-digit format which is always interpreted YYYYMMDD regardless
-- of language or dateformat settings
select case
when @input not like '__/__/____' then 0
else isdate(right(@input,4)+right(left(@input,5),2)+left(@input,2))
end