我创建一个临时表
CREATE TABLE #Test(theDate DATETIME)
我使用此查询将数据插入临时表
INSERT INTO #Test VALUES(CONVERT(NVARCHAR, '2016-09-30' 21))
它适用于一个数据库(SQL Server 2005),但在另一个数据库(SQL Server 2008)上出错。我无法记住确切的错误,但它与'Error converting NVARCHAR TO DATETIME'
为什么要在一个数据库上工作,而不是另一个?是否有特殊属性可以对不匹配的类型强制执行错误?我无法在任何地方找到信息。
答案 0 :(得分:3)
有几个问题:
CONVERT
将字符串转换为字符串,同时需要DATE
NVARCHAR
没有长度(默认为1)Bad habit to kick 21
格式,其中 2位数年份 Details here 这是更好的
SELECT CONVERT(DATETIME, '2016-09-30', 121)
但更好的是避免转换。
在您的情况下使用Details here
INSERT INTO #Test VALUES('20160930')
INSERT INTO #Test VALUES({d'2016-09-30'})
我无法检查这个,没有安装这样的版本,但我很确定,不同的默认文化/语言和隐式纠错会导致这种行为...
在我的SQL Server 2012实例上,所有这些都可以正常工作。显式格式错误(21而不是121)被隐式纠正。第二个明显的错误(转换为1-char-string)也得到了纠正。较低版本以不同方式处理(可能)。
如果可能,请在您的服务器上尝试这些行...
SET LANGUAGE US_ENGLISH; --MDY
SELECT CONVERT(NVARCHAR, '2016-09-30', 21)
SET LANGUAGE GERMAN; --DMY
SELECT CONVERT(NVARCHAR, '2016-09-30', 21)
SET LANGUAGE JAPANESE; --YMD
SELECT CONVERT(NVARCHAR, '2016-09-30', 21)
文字日期格式YYYY-MM-DD
,即使这是短ISO8601,在所有情况下都不确定。这就是为什么人们应该始终使用与文化无关的格式......
答案 1 :(得分:0)
如果是与语言相关的问题,您可以尝试此操作
declare @language as varchar(100)
SELECT @language= @@LANGUAGE
SET LANGUAGE us_english
--... your code...
SET LANGUAGE @language