2016-02-09 4 views
0

У меня есть столбец в SQL, где в данных хранится как 102915, 060315 и так далее. Тип данных столбца: nvarchar(50). Я хочу преобразовать вышеуказанные данные в формат даты.Преобразование nvarchar в DATE

Он должен выглядеть как 10-29-15 или 10/29/15.

Как я могу преобразовать вышеуказанное в SQL Server Management Studio 2008?

Пробовал довольно много вещей: Один из них

create view v1 
as 
    Select 
     CAST([ISSUE] as date) as ISSUE, 
     CAST([EXPIRE] as date) as EXPIRE 
    from tablename 

мнение создается.

Примечание: ISSUE и EXPIRE - это имена столбцов, которые имеют значения, такие как 100515, 060315, и мне нужно преобразовать все значения в этих столбцах в 10-05-15 или 10/05/15.

Когда я делаю select * from v1; я получаю следующее сообщение об ошибке:

Conversion failed when converting data and/or time from character string.

+0

Что вы пытаетесь не работать? – zee

+0

Я пробовал использовать бросок и конвертировать, но не помог мне. –

+1

Возможно, вам следует опубликовать свои попытки, чтобы кто-то мог указать на ошибку ... –

ответ

2

Вы можете попробовать это:

DECLARE @date VARCHAR(50) = '102915' 

SELECT CAST( CAST('20'+     --prefix for the year 2000 
         SUBSTRING(@date,5,2)+ --year 
         SUBSTRING(@date,1,2)+ --month 
         SUBSTRING(@date,3,2) --day 
       AS VARCHAR(10)) 
      AS DATE) 

результат:

enter image description here

Но это будет означать, что ваши даты больше, чем в 1999 году.

как ваш формат даты MMddYY трудно достичь правильной даты в течение года.

Таким образом, для вашего зрения, вы можете использовать:

create view v1 as 
    Select CAST( CAST('20'+     --prefix for the year 2000 
          SUBSTRING([ISSUE],5,2)+ --year 
          SUBSTRING([ISSUE],1,2)+ --month 
          SUBSTRING([ISSUE],3,2) --day 
        AS VARCHAR(10)) 
       AS DATE) as ISSUE 
      , 
     CAST( CAST('20'+     --prefix for the year 2000 
          SUBSTRING([EXPIRE],5,2)+ --year 
          SUBSTRING([EXPIRE],1,2)+ --month 
          SUBSTRING([EXPIRE],3,2) --day 
        AS VARCHAR(10)) 
       AS DATE) as EXPIRE 
    from tablename 

Чтобы иметь дату в формате ДД-ММ-ГГГГ вам нужно использовать CONVERT вы можете увидеть различные преобразования here:

create view v1 as 
     Select convert(VARCHAR ,CAST(CAST('20'+     --prefix for the year 2000 
           SUBSTRING([ISSUE],5,2)+ --year 
           SUBSTRING([ISSUE],1,2)+ --month 
           SUBSTRING([ISSUE],3,2) --day 
         AS VARCHAR(10)) 
        AS DATE), 110) as ISSUE 
       , 
      convert(VARCHAR ,CAST( CAST('20'+     --prefix for the year 2000 
           SUBSTRING([EXPIRE],5,2)+ --year 
           SUBSTRING([EXPIRE],1,2)+ --month 
           SUBSTRING([EXPIRE],3,2) --day 
         AS VARCHAR(10)) 
        AS DATE), 110) as EXPIRE 
     from tablename 
+0

Практически там. когда я пытаюсь получить его в MM-DD-YYYY, я получаю ту же ошибку, что и раньше. –

+0

Вы можете использовать код, который используете. Благодаря –

+0

CAST (CAST ( SUBSTRING ([НОМЕР], 1,2) + --month SUBSTRING ([НОМЕР], 3,2) + --day '20' + --prefix за год 2000 SUBSTRING ([ВОПРОС], 5,2) - год AS VARCHAR (10)) AS DATE) as ВОПРОС Это то же самое, что вы предоставили, а просто изменили заказ, только чтобы понять, что формат даты Не принимай это !!! –

0

Если вы используете SQL Server 2012, вы получили функцию DATEFROMPARTS. Он принимает три параметра int - год, месяц и день - и возвращает дату.

С SQL Server 2008 вы должны сделать что-то больше, как это -

Declare @Year as int=2012 
Declare @Month as int=12 
Declare @Day as int=31 

Select Convert(Date,Convert(varchar(4), @Year) 
+ 
Convert(varchar(2), @Month) 
+ 
Convert(varchar(2), @Day)) 

(http://raresql.com/tag/sql-server-2012-date-and-time-function-datefromparts/)

Вы можете разделить ваш вход, используя SUBSTRING, так что-то вроде

DECLARE @Year nvarchar(4) ='20' + SUBSTRING(InputField,1,2) 

Etc Объедините два метода, и у вас будет рабочее решение.

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

+0

Я импортирую дату с мэйнфрейма на сервер sql, и, следовательно, он входит в вышеупомянутый формат. –

-1

вы должны использовать это:

CONVERT(date, YOUR_DATE_FIELD, 1) AS DATE 

Иногда вы не можете преобразовать так же легко, как и выше, и вы должны использовать такие функции, как ЛЕВЫЙ, SUBSTR и вправо.

Что-то вроде этого:

SELECT CONVERT(DATE, LEFT(field, 2) + SUBSTR(field, 2, 2) + RIGHT(field, 2), 1) AS DATE 

Источник: https://msdn.microsoft.com/es-es/library/ms187928%28v=sql.120%29.aspx

0

Это намного проще:

select convert(nvarchar(50), convert(date, RIGHT('102915',2) + LEFT('102915',4), 112), 110) 

и соответственно:

create view v1 as 
    Select 
     convert(nvarchar(50), convert(date, RIGHT([ISSUE],2) + LEFT([ISSUE],4), 112), 110) as ISSUE, 
     convert(nvarchar(50), convert(date, RIGHT([EXPIRE],2) + LEFT([EXPIRE],4), 112), 110) as EXPIRE 
    from tablename 
+0

Не получает желаемый формат MM-DD-ГГГГ !! –

+0

Ну, вы попросили преобразовать дату. Я отредактировал для вывода даты в виде строки в нужном формате. – nanestev

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