在插入日期时间时,将日期和/或时间从字符串中转换出来,转换失败

我试图创建一个如下的表格。

create table table1(date1 datetime,date2 datetime);

首先,我试着插入下面的值。

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

它出现了错误,说。

不能将varchar转换为datetime

然后我尝试了下面的格式,这是我们stackoverflow的一个帖子的建议。

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

但我还是得到了错误的提示。

从字符串转换日期和/或时间时转换失败

有什么建议吗?

解决办法

SQL Server支持的格式有很多--参见MSDN Books Online on CAST and CONVERT。这些格式中的大多数是***依赖于你的设置的--因此,这些设置可能在某些时候起作用--而有时则不起作用。

解决这个问题的方法是使用SQL Server支持的(稍作调整)ISO-8601日期格式-这个格式总是***地工作--不管你的SQL Server语言和日期格式设置如何。

SQL Server支持的ISO-8601格式有两种类型。

  • YYYYMMDD只表示日期(没有时间部分);注意这里。没有破折号!,这一点非常重要。YYYY-MM-DD不是独立于你的SQL Server中的数据格式设置,也不是在所有情况下都能工作

或。

  • YYYY-MM-DDTHH:MM:SS用于日期和时间 - 注意:这种格式个破折号(但它们可以省略),并且在DATETIME的日期和时间部分之间有一个固定的T作为分隔符。

这对SQL Server 2000和更新的版本有效。

所以在你的具体案例中--使用这些字符串。

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

就可以了(注意:你需要使用国际24小时格式,而不是12小时AM/PM格式)。

另外:如果你使用的是SQL Server 2008或更新版本,你也可以使用DATETIME2数据类型(而不是普通的DATETIME),你现在的INSERT就可以正常工作,没有任何问题!:-)DATETIME2在转换上要好得多,而且不那么挑剔--反正它是SQL Server 2008或更新版本的推荐日期/时间数据类型。

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

不要问我为什么这整个话题是如此棘手和令人困惑的--这就是它的方式。但是使用YYYYMMDD格式,对于任何版本的SQL Server和SQL Server中的任何语言和数据格式设置,你都应该没有问题。

评论(3)

在SQL服务器中转换失败有时不是因为使用的日期或时间格式,只是因为你试图存储错误的数据,而这是系统所不能接受的。

例子。

创建表MyTable (MyDate);`。

在MyTable(MyDate)中插入数值('2015-02-29');

SQL服务器将抛出以下错误。

`当从字符串转换日期和/或时间时,转换失败。

这个错误的原因是,在2015年没有这样的日期(2月29日)。

评论(2)

简单的答案--5是意大利语"yy",105是意大利语"yyy"。因此。

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

将正确工作,但

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

会出现错误。

同样地。

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

会出现错误,如

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

则可以工作。

评论(0)