2016-03-29 3 views
3

Предположим, что я создал таблицу и вставить данные, как показано нижеКак конвертировать VARCHAR в DateTime для любого формата в SQL

create table datetimefromat 
(
    SlNo int identity, 
    datetimeVarchar varchar(100) 
) 
go 

DECLARE @now datetime 

SET @now = GETDATE() 

insert into datetimefromat (datetimeVarchar) 
values (convert(nvarchar(MAX), @now, 0)), 
     (convert(nvarchar(MAX), @now, 1)), 
     (convert(nvarchar(MAX), @now, 3)), 
     (convert(nvarchar(MAX), @now, 5)), 
     (convert(nvarchar(MAX), @now, 20)), 
     (convert(nvarchar(MAX), @now, 13)), 
     (convert(nvarchar(MAX), @now, 22)), 
     (convert(nvarchar(MAX), @now, 111)); 
go 

select * from datetimefromat 
go 

+------+--------------------------+ 
| SlNo |  datetimeVarchar  | 
+------+--------------------------+ 
| 1 | Mar 29 2016 12:46PM  | 
| 2 | 03/29/16     | 
| 3 | 29/03/16     | 
| 4 | 29-03-16     | 
| 5 | 2016-03-29 12:46:32  | 
| 6 | 29 Mar 2016 12:46:32:087 | 
| 7 | 03/29/16 12:46:32 PM  | 
| 8 | 2016/03/29    | 
+------+--------------------------+ 

Я хочу, чтобы преобразовать его в обычный DateTime

select 
    *, 
    CONVERT(datetime, datetimeVarchar) 
from datetimefromat 

Но это вызывает ошибку

Msg 242, уровень 16, состояние 3, строка 11
конверсии ти VARCHAR данных pe к типу данных datetime привели к превышению значения.

Как это исправить?

Потому что я хочу, чтобы обновить существующие записи и изменить varchar столбец datetime

+4

«Как исправить это» - не хранить дату как строку на первом месте? –

+2

Записи 2 и 3 хранятся в формате «dd/mm/yy» и «mm/dd/yy» соответственно. Предполагая, что вы выполнили этот запрос 4 марта, они будут храниться как '04/03/16 'и '03/04/16'. Компьютер не может решить, будет ли это 3 марта или 4 апреля. На самом деле человеку негде это знать ...! –

+0

Предположим, что у вас нет контроля над db (в противном случае не сохраняйте даты как строки, как сказал Митч), эти даты невозможно исправить. Какая дата будет «03-04-2016»? 3 апреля или 4 марта? Если вы не можете сказать, как вы собираетесь интерпретировать это sql-server? – HoneyBadger

ответ

0

Две вещи. Во-первых, вам нужно указать стиль при преобразовании обратно в datetime. Во-вторых, 22 не является допустимым стилем.

Этот код работает:

CREATE TABLE datetimeformat 
    (SlNo INT IDENTITY, 
    datetimeVarchar VARCHAR(100), 
    datetimeFormat INT); 
GO 

DECLARE @now DATETIME = GETDATE(); 

INSERT INTO 
    datetimeformat (datetimeVarchar, datetimeFormat) 
VALUES 
    (CONVERT(NVARCHAR(MAX), @now, 0), 0), 
    (CONVERT(NVARCHAR(MAX), @now, 1), 1), 
    (CONVERT(NVARCHAR(MAX), @now, 3), 3), 
    (CONVERT(NVARCHAR(MAX), @now, 5), 5), 
    (CONVERT(NVARCHAR(MAX), @now, 20), 20), 
    (CONVERT(NVARCHAR(MAX), @now, 13), 13), 
-- (CONVERT(NVARCHAR(MAX), @now, 22), 22), 
    (CONVERT(NVARCHAR(MAX), @now, 111), 111); 
GO 

SELECT 
    *, 
    CONVERT(DATETIME, datetimeVarchar, datetimeFormat) 
FROM 
    datetimeformat; 
GO 
+0

[MSDN] (https://msdn.microsoft.com/en-za/library/ms187928.aspx) перечислены возможные стили. –

0

Пожалуйста, попробуйте ниже запрос, это может быть поможет вам

select CAST((CASE WHEN isdate(datetimeVarchar) = 1 THEN datetimeVarchar 
    ELSE SUBSTRING(datetimeVarchar,4,3)+LEFT(datetimeVarchar,3)+RIGHT(datetimeVarchar,2) 
    END) AS DATETIME) 
from datetimefromat 

Вы можете использовать функцию isdate проверить данное значение является действительной датой или нет , и на основе флага результата вы можете построить свою собственную логику (то есть часть else).

SELECT (CASE WHEN ISDATE(datetimeVarchar) = 1 THEN CAST(datetimeVarchar AS DATETIME) 
     ELSE [*Use logic to convert/skip other string values here*] END) 
from datetimefromat 
Смежные вопросы