相关疑难解决方法(0)

SQL Server如何确定隐式日期时间转换的格式?

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 datetime implicit implicit-conversion

18
推荐指数
1
解决办法
2万
查看次数

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)

t-sql sql-server sql-server-2008

5
推荐指数
1
解决办法
431
查看次数