我有一个表,其中activedate是nvarchar列,我需要将其转换为datetime以与另一个datetime字段进行比较。我目前的数据采用以下格式:
3/19/2013 4:18:59
我试过这个:
alter table [stresstest].[dbo].[temporaryVSDB]
alter column activateDate datetime;
和
convert(datetime,activateDate,101)
但不行。
我收到以下错误消息:
Conversion failed when converting date and/or time from character string.
请帮忙。
答案 0 :(得分:0)
可能因为第三个opf无论是第19个月都不是有效的时间。
RTFM说格式101是:mm / dd / yyyy - 看起来只对我来说是日期。
时间格式包括其他格式代码,您可以在http://msdn.microsoft.com/en-us/library/ms187928.aspx的表格中看到(这意味着:文档)。
答案 1 :(得分:0)
只需在给定或插入日期时间值之前设置Dateformat。
检查出来。
declare @t table(dtcolumn datetime)
set dateformat mdy
insert into @t values('3/19/2013 4:18:59')
select * from @t
答案 2 :(得分:0)
您的系统未设置为DateTime的MDY格式,这就是您收到此错误的原因。 尝试更改日期格式。
SET DATEFORMAT MDY;
SELECT CAST('19/3/2013 4:18:59' AS DATETIME)
但是,SET DATEFORMAT
会覆盖SET LANGUAGE的隐式日期格式设置。
答案 3 :(得分:0)
您不应将数据时间存储为nvarchar或任何其他字符类型。 Datetime属于datetime字段。如果你在比较它的同时转换它,你会得到一个糟糕的表现。 如果您坚持使用当前的数据模型,则可以添加新的计算字段。这是转换为PERSISTED计算列。 PERSISTED计算列的优点是具有可以索引的实际值。
这个例子看起来很糟糕。然而,它会计算你的领域。使用普通计算列很容易,但会导致性能问题。这将要求YourColumn中的所有值都具有有效的日期时间值。
CREATE TABLE #t(YourColumn varchar(18))
INSERT #t
values ('3/19/2013 4:18:59'),
('3/9/2013 5:18:59'),
('01/9/2013 6:18:59'),
('12/9/2013 17:18:59')
ALTER TABLE #t
ADD CDateColumn AS
CONVERT(datetime,
LEFT(STUFF(YourColumn, 1, CHARINDEX('/', YourColumn, 4), ''), 4)
+'-' + SUBSTRING('0' + YourColumn, PATINDEX('%__/%', ' ' +YourColumn), 2) + '-'
+RIGHT('0'+REPLACE(LEFT(STUFF(YourColumn, 1, CHARINDEX('/', YourColumn), ''), 2), '/', ''), 2) + 'T'
+RIGHT('0'+REPLACE(LEFT(STUFF(YourColumn, 1, CHARINDEX(' ', YourColumn), ''), 2), ':', ''), 2)
+RIGHT(YourColumn, 6), 126) PERSISTED
结果将是:
SELECT * FROM #t
YourColumn CDateColumn
3/19/2013 4:18:59 2013-03-19 04:18:59.000
3/9/2013 5:18:59 2013-03-09 05:18:59.000
01/9/2013 6:18:59 2013-01-09 06:18:59.000
12/9/2013 17:18:59 2013-12-09 17:18:59.000
注意:如果您将其更改为:
,则当前脚本将起作用CONVERT(datetime,activateDate,0)