Как преобразовать nvarchar datetime в datetime в SQL Server 2008?

1

У меня есть таблица, где 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
    А что именно «не работает»? Вы получаете сообщение об ошибке? Есть ли возможно недопустимые форматы DateTime в столбце activateDate ?
  • 0
    что значит «не работает»? любое сообщение об ошибке?
Показать ещё 3 комментария
Теги:
sql-server
datetime

4 ответа

0

Вы не должны хранить дату-время как nvarchar или любой другой тип символа. Datetime принадлежит к полю datetime. Если вы его конвертируете, сравнивая его, вы получаете ужасную производительность. Если вы застряли в текущем datamodel, вы можете добавить новое вычисленное поле. Вот преобразование в вычисляемый столбец 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

NB: Ваш текущий скрипт будет работать, если вы измените его на:

CONVERT(datetime,activateDate,0)
0

Ваша система не установлена в формате MDY для DateTime, поэтому вы получаете эту ошибку. Попробуйте изменить формат даты.

SET DATEFORMAT MDY;
SELECT CAST('19/3/2013 4:18:59' AS DATETIME)

Однако SET DATEFORMAT переопределяет параметр неявного формата даты SET LANGUAGE.

0

Вероятно, потому что третий opf, какой бы ни был 19-й месяц, не является validadatetime.

RTFM говорит, что формат 101 равен: mm/dd/yyyy - который выглядит как дата только для меня.

TIme, включая форматы, имеет другие коды формата, которые вы можете увидеть в таблице по адресу http://msdn.microsoft.com/en-us/library/ms187928.aspx (что означает: Документация).

0

Просто установите Dateformat перед заданием или вставьте значения (значения) даты и времени.

проверьте это.

declare @t table(dtcolumn datetime)

set dateformat mdy
insert into @t values('3/19/2013 4:18:59')

select * from @t

Ещё вопросы

Сообщество Overcoder
Наверх
Меню