如何在SQL Server 2008中将nvarchar datetime转换为datetime?

时间:2014-06-13 09:25:51

标签: c# sql sql-server datetime

我有一个表,其中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.

请帮忙。

4 个答案:

答案 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)