我试图创建一个如下的表格。
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中的任何语言和数据格式设置,你都应该没有问题。
简单的答案--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)
则可以工作。