2011-11-06 76 views
0

我有一个varchar列包含日期格式如下发行日期与SQL Server

dd/mm/yyyy 

我需要列的数据类型转换为DATE。我使用下面的查询

alter table [tblDocumentRevision] 
alter column [RevisionDate] date null 

,但我得到一个错误

消息241,级别16,状态1,行
转换从字符串转换日期和/或时间时失败。
该声明已被终止。

我确定所有的值都是dd/mm/yyyy格式。那么为什么它给了我错误?

然后,我添加一个新的列,并试图

UPDATE [tblDocumentRevision] 
SET NewDate = convert(date,[RevisionDate],103) 
WHERE ISDATE([RevisionDate]) = 1 

ISDATE() = 1用于该检查应该过滤掉不能被转换为DATE那些条目。

然后NewDate列中只有月份和日期都小于或等于12个值的值为空。所以我很清楚地看到dd/mm/yyyy格式的问题

有人可以帮我解决这个问题吗?

回答

2

我用Google找到了this。尝试设置正在运行的格式ALTER COLUMN

EDIT

CREATE TABLE #tmpTest 
(
    MyCol VARCHAR(20) 
); 

INSERT INTO #tmpTest(MyCol) 
    VALUES('31/12/99'); 

ALTER TABLE #tmpTest ALTER COLUMN MyCol DATE; 

收率:

消息241,级别16,状态1,行9
转换从字符串变换日期和/或时间时失败。
该声明已被终止。

鉴于:

CREATE TABLE #tmpTest 
(
    MyCol VARCHAR(20) 
); 

INSERT INTO #tmpTest(MyCol) 
    VALUES('31/12/99'); 

SET DATEFORMAT DMY; 

ALTER TABLE #tmpTest ALTER COLUMN MyCol DATE; 

产量:

(1 row(s) affected) 
+0

SET DATEFORMAT是一个会话选项,不是列属性。 –

+0

是的,所以将它设置为您的会话,然后在您的会话中更改列。 –

+0

好的。误解了你的建议。 +1。你可能想在你的答案中把'being'改成''before'',这样你的意思就更清楚了。 –

0

默认情况下,日期格式取决于服务器的语言环境。因此,如果不明确定义此格式,则不能依赖DD/MM/YYYY格式。

您使用正确样式说明符添加新列和使用CONVERT的方法应该可行,但您不能使用ISDATE函数检查日期,因为函数不会知道用于解析日期的自定义样式,除非如todda.speot.is所示,您可以更改格式。

UPDATE [tblDocumentRevision] SET NewDate = convert(date,[RevisionDate],103) 
+0

它取决于登录语言,因此只能间接地服务器的语言环境。 –

+0

@MartinSmith,true,但是除非你用'sp_configure'将登录配置成特定的格式,否则它将使用服务器区域设置。另请参阅[kb173907](http://support.microsoft.com/kb/173907)。 – Lucero