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
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误:
消息242,级别16,状态3,行4
将varchar数据类型转换为日期时间数据类型导致超出范围的值.
我的问题是SQL Server如何决定使用哪种格式进行隐式日期时间转换?
更新:这是一个错误,但由于向后兼容性问题,在SQL Server的下一个版本之前不会得到修复.
这是我回答的这个问题,但我仍然感到困惑.
添加TOP (1)到查询就足以将结果从"2010年9月3日"更改为"2010-09-03"(至少在我的英国设置机器上)可以解释为什么?这是一个错误还是在某处记录?
注意:我也在下面发现,如果我使用了一个#temp表,那么两个查询都会返回2010-09-03
USE tempdb
BEGIN TRAN
CREATE TABLE t (d DATETIME NOT NULL)
INSERT INTO t VALUES (GETDATE())
SELECT (CONVERT(VARCHAR(50),CONVERT(DATE, d))) + CONVERT(VARCHAR(50), '')
FROM t
/*
Returns "Sep 3 2010"
[Expr1004] = Scalar Operator(CONVERT(varchar(50),
CONVERT(date,[tempdb].[dbo].[t].[d],0),
0)+
CONVERT(varchar(50),[@1],0))
*/
SELECT TOP 1 (CONVERT(VARCHAR(50),CONVERT(DATE, d))) + CONVERT(VARCHAR(50), '')
FROM t
/*
[Expr1004] = Scalar Operator(CONVERT(varchar(50),
CONVERT(date,[tempdb].[dbo].[t].[d],0),
121)+
'')
Returns "2010-09-03"
*/
ROLLBACK
Run Code Online (Sandbox Code Playgroud)