在T-SQL转换函数上指定样式会导致错误

时间:2015-01-09 20:52:32

标签: sql-server tsql

我有一个存储过程,它以各种格式接收日期并将它们转换为日期时间。以下行与预期一样有效:

RETURN CONVERT(datetime,@vMonth+'/'+@vDay+'/'+@vYear)

但是,我想指定日期应始终被视为美国格式,因为如果将T-SQL设置为使用英语,则会返回错误的结果。如果我这样做:

RETURN CONVERT(datetime,@vMonth+'/'+@vDay+'/'+@vYear, 101)

然后我开始收到以下错误(在我尝试的所有值上):

Conversion failed when converting date and/or time from character string.

我已经完成了搜索,并且没有提到此错误的线程似乎都是同一个问题。我很困惑为什么为已经被转换为us_english的字符串指定us_english(101)会导致过程中断。

编辑:我已将其归结为最小的案例,显示我不理解的地方。

这有效:

select CONVERT(datetime,'01/02/03')

这不是:

select CONVERT(datetime,'01/02/03',101)

2 个答案:

答案 0 :(得分:0)

这对我来说很好。没有错误。

declare @mydate datetime = getdate()

declare @vMonth varchar(10), @vDay varchar(10), @vYear varchar(10)

set @vMonth = cast(DATEPART(mm, @mydate) as varchar(10))
set @vDay = cast(DATEPART(dd, @mydate) as varchar(10))
set @vYear = cast(DATEPART(YYYY, @mydate) as varchar(10))

select CONVERT(datetime, @vMonth+'/'+@vDay+'/'+@vYear, 101)

结果:

2015-01-09 00:00:00.000

答案 1 :(得分:0)

事实证明,当使用101作为语言时,SQL Server希望世纪是XXXX格式。要正确处理2位数年份,您必须使用1作为语言。