2013-07-26 3 views
1

У меня есть столбец даты и времени, как это:Преобразовать VARCHAR для даты и времени SQL Server 2008

20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:43 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:47 
    20/Mar/2013:02:28:41 
    20/Mar/2013:02:28:46 

тип данных этого столбца установлено значение «VARCHAR». Мне просто нужно, чтобы преобразовать следующий формат колонки для:

20/03/2013:02:28:47 
    20/03/2013:02:28:43 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:47 
    20/03/2013:02:28:41 
    20/03/2013:02:28:46 

также может я изменить его тип с VARCHAR на сегодняшний день SQL и времени типа данных! Я пытаюсь с моим запросом, как:

SELECT convert(mydatetimecolumn,105) from mytable 

, но это дает мне результат, как:

1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 
    1900-04-16 00:00:00.000 

Как я могу решить эту проблему? может кто-нибудь мне помочь? Заранее спасибо!

+7

Почему вы храните значения даты и времени в столбце строки? Также вы можете показать пример того, как выглядит 4 марта? У него есть ведущий 0 или нет? –

+0

Фактически я импортирую данные из файла excel, поэтому – user2496503

+3

Итак, почему ваш файл Excel имеет такие ужасные форматы? –

ответ

4

Это одно возможное решение, предполагая, что в этом столбце нет нежелательной почты, которая не может быть преобразована правильно (что вполне возможно, поскольку по какой-то причине вы решили хранить даты как строки).

Обратите внимание, что это образец, а не то, что вы можете применить непосредственно к существующей таблице. Это специально. Это намеренно создается в tempdb и с фиктивными/бессмысленными именами таблиц, поэтому вы можете попробовать его, а не пытаться что-либо прямо против вашей производственной таблицы. Потому что, что произойдет, если вы запустите обновление против вашей реальной таблицы, и это не работает, как вы ожидаете? У вас есть резервная копия?

USE tempdb; 
GO 

CREATE TABLE dbo.floob(splunge VARCHAR(32)); 

INSERT dbo.floob(splunge) VALUES('20/Mar/2013:02:28:47'),('4/Mar/2013:02:25:32'); 

UPDATE dbo.floob SET splunge = CONVERT(CHAR(8), 
    CONVERT(DATETIME, REPLACE(LEFT(splunge, 
    CHARINDEX(':', splunge)-1), '/', ' '), 13), 112) 
    + ' ' + RIGHT(splunge, 8); 

SELECT splunge FROM floob; 
GO 

SELECT CONVERT(DATETIME, splunge) FROM floob; 
GO 

ALTER TABLE dbo.floob ALTER COLUMN splunge DATETIME; 
GO 

SELECT splunge FROM floob; 
GO 

Для вашей реальной таблицы, опять же при условии, что нет старья в таблице, вы просто делаете UPDATE и ALTER части (конечно, положить в ваших реальных именах таблиц и столбцов вместо floob и splunge).

SQLfiddle example

+0

Мне не нужно создавать новый стол! :( – user2496503

+4

@ user2496503 Я знаю это. Это * образец *, вы можете попробовать самостоятельно и убедиться, что он работает, прежде чем вы сделаете это в своей * реальной * таблице. Вы не дали нам настоящую таблицу или столбец имена, так что я не уверен, почему вы ожидаете решения, которые будут работать против объектов, которые у вас есть. –

0

Один из способов;

declare @s varchar(32) = '20/Mar/2013:02:28:46' 

select cast(stuff(replace(@s, '/', ' '), 12, 1, ' ') as datetime) 

(No column name) 
2013-03-20 02:28:46.000 

Использование

cast(stuff(replace(@s, '/', ' '), len(@s) - 8, 1, ' ') as datetime) 

Если день d или dd.

Смежные вопросы