将NVARCHAR转换为DATETIME时出错

时间:2016-09-30 23:05:22

标签: sql-server sql-server-2008 sql-server-2005

我创建一个临时表

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'

有关

为什么要在一个数据库上工作,而不是另一个?是否有特殊属性可以对不匹配的类型强制执行错误?我无法在任何地方找到信息。

2 个答案:

答案 0 :(得分:3)

有几个问题:

  • 使用CONVERT将字符串转换为字符串,同时需要DATE
  • 您使用的NVARCHAR没有长度(默认为1)Bad habit to kick
  • 日期文字
  • 后缺少逗号
  • 您使用的是21格式,其中 2位数年份 Details here

这是更好的

SELECT CONVERT(DATETIME, '2016-09-30', 121)

但更好的是避免转换。

在您的情况下使用Details here

  • unseparated:INSERT INTO #Test VALUES('20160930')
  • ODBC(我最喜欢的):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