CAST无法创建日期

时间:2013-04-09 12:57:25

标签: sql-server tsql

我的演员失败了,我无法理解为什么。

这是失败的原因:

select cast('16/04/2012' as datetime)

错误是:

  

“将char数据类型转换为datetime数据类型   在超出范围的日期时间值。“

如果我使用CONVERT格式为103,那么它可以正常运行。

服务器设置为英国日期格式,因此MSSQL帐户也应该默认为britsh格式。它已重新启动,因此不应该是该服务使用不同的日期格式。

这是一个SQL2005实例。

我真正想知道的是,什么可能导致CAST失败?

6 个答案:

答案 0 :(得分:1)

使用此代码:

SELECT convert(datetime, '16/04/2012',105)

答案 1 :(得分:0)

您是否尝试过SET DATEFORMAT DMY

答案 2 :(得分:0)

日期格式和日期时间格式不一定相同。虽然它可能会隐式添加00:00:00为hh:mm:ss,但也可以尝试添加它。 103型只包括dd / mm / yyyy,所以它当然有效。

答案 3 :(得分:0)

你有一个数据格式为MM:dd:YY,并且强制尝试转换你'16 / 04/2012',即'dd / MM / yy'并抛出异常,因为16小于12个月。

您可以在server settings中更改数据格式,也可以在查询前使用SET DATEFORMAT语句

答案 4 :(得分:0)

您确定服务器是英语格式吗?如果我跑:

set language british
select cast('16/04/2012' as datetime)

然后我得到:

  

2012-04-16 00:00:00.000

您可以使用

检查当前的会话语言
select @@language

会话语言默认来自正在使用的登录,假设它是SQL Server配置的登录(即不是Windows用户)。要检查给定用户的语言:

select loginproperty('myuser', 'DefaultLanguage')

为所有新创建的登录进行永久性服务器更改:

EXEC sp_configure 'default language', 23
reconfigure

...其中23是通过langid获得的sp_helplanguage

答案 5 :(得分:0)

始终使用语言中性日期格式 - 无论任何设置,它始终有效:

CAST('YYYYMMDD', AS DATE);

4位数年份,2位数月份,2位数日期和NO分隔符。您再也不用担心默认语言设置了。