Конвертировать varchar на сегодняшний день - PullRequest
6 голосов
/ 07 октября 2010

У меня (к сожалению) есть некоторые даты, которые были сохранены в столбцах varchar.Эти столбцы содержат даты в следующем формате:

ммддей

Например:

010110

Мне нужно импортировать эти значения в таблицу, которая установлена ​​в datetime и форматирует даты следующим образом:

2010-09-17 00: 00: 00.000

Как можноЛи я преобразовать строку выше в значение datetime ниже?

Ответы [ 7 ]

8 голосов
/ 07 октября 2010

Функция CAST сделает это, проблема в том, что первые 2 цифры обозначают год. Это должно для вас:

SELECT CAST((RIGHT('010110',2) + LEFT('010110',4)) AS DATETIME)

Предполагается, что все даты - ММДДГГ.

5 голосов
/ 07 октября 2010

Вот решение

SELECT CAST(SUBSTRING(@date, 5, 2) + SUBSTRING(@date, 1, 4) AS DATETIME)
3 голосов
/ 07 октября 2010

Получите строку в формате YYMMDD, и вы должны быть в хорошей форме:

declare @x varchar(6)
set @x = '091710'

declare @d datetime

set @d = cast(RIGHT(@x,2) + LEFT(@x,4) as datetime)

select @d
2 голосов
/ 07 октября 2010

Что поддерживаемые стили преобразования даты описаны в MSDN . Плохая новость в том, что для mmddyy нет стиля. Таким образом, вам придется сделать пользовательское форматирование. Как это сделать, зависит от того, как вы импортируете. Это шаг SSIS ETL? Это однократная копия таблицы?

Вы можете произвольно преобразовать указанный формат прямо из T-SQL:

declare @x varchar(6) = '010110';

select dateadd(month, cast(substring(@x, 1,2) as int)-1,
    dateadd(day, cast(substring(@x,3,2) as int)-1,
    dateadd(year, cast(substring(@x,5,2) as int),'01-01-2000')));
2 голосов
/ 07 октября 2010

Используйте подстроку для захвата соответствующих частей в формате 'гггг-мм-дд', затем cast до даты и времени:

cast(
    '20' + substring(col1,5,2) + '-' +
    substring(col1,1,2) + '-' +
    substring(col1,3,2)
    as datetime)
1 голос
/ 07 октября 2010

попробуйте что-то вроде этого:

DECLARE @OldTable table (col1 int, col2 char(1), col3 char(6))
DECLARE @NewTable table (col1 int, col2 char(1), col3 datetime)
INSERT @OldTable VALUES (1,'A','010110') --mmddyy = jan  1, 2010
INSERT @OldTable VALUES (1,'A','091710') --mmddyy = sep 17, 2010

INSERT INTO @NewTable
        (col1, col2, col3)
    SELECT
        col1, col2, RIGHT(col3,2) + LEFT(col3,4) --<< cast to datetime not needed... 
        FROM @OldTable                           --<< because @NewTable.col3 is datetime
        ORDER BY Col1

SELECT * FROM @NewTable

ВЫВОД:

col1        col2 col3
----------- ---- -----------------------
1           A    2010-01-01 00:00:00.000
1           A    2010-09-17 00:00:00.000

(2 row(s) affected)
0 голосов
/ 11 марта 2013

Это будет работать для varchar строки длиной 6 символов

CAST((RIGHT('130513',2) + ltrim(rtrim(right(left('130513', 4), 2))) + LEFT('130513',2) ) AS DATETIME)

Это преобразует строку в 13 мая 2013

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...