2015-04-21 5 views
0

В MyTable находится столбец ValuesNVARCHAR тип данных. Здесь помещены многие ценности, как:Как получить точный формат даты от стоимости?

Alisa 
20150111 
Something 12 
Etc 2222 
4444 
01/21/2015 11:01:12 AM 
etc 

мне нужно выбрать все значения этого столбца, но где формат как mm/dd/yyyy hh:mm:ss AM/PM мне нужно, чтобы преобразовать его в DATE (без времени) mm/dd/yyyy

Я пытался использовать ISDATE, но он не работает, как я хочу, он также преобразует другие значения на сегодняшний день, например, из моего списка образцов 4444 в формат даты.

Это мой запрос на данный момент:

SELECT CASE WHEN ISDATE(Values) = 1 THEN CONVERT(VARCHAR(20), Values, 101) 
      ELSE Values 
     END AS Val1 
FROM MyTable 

Так список должен быть возвращен в следующем:

Alisa 
20150111 
Something 12 
Etc 2222 
4444 
01/21/2015 -- this line should be changed 
etc 
+1

'20150111' кажется как дата слишком – Lamak

+0

Вот почему мне нужно преобразовать только формат, как это: дд' мм// yyyy hh: mm: ss AM/PM' –

+0

Вы можете попытаться использовать регулярное выражение в соответствии с желаемым форматом. – Guneli

ответ

0

Может попытаться проверить, если строка содержит /, как показано ниже:

SELECT CASE WHEN ISDATE(Values) = 1 and CHARINDEX('/',Values) > 0 
      THEN CONVERT(VARCHAR(20), Values, 101) 
      ELSE Values 
     END AS Val1 
FROM MyTable 
+0

Я уже нашел решение силимара для вашего, и он работал, я буду принимать его как правильный ответ через 7 минут. –

2

Ставка

SELECT CASE WHEN Values LIKE '__/__/____%' THEN CONVERT(VARCHAR(20), Values, 101) 
      ELSE Values 
     END AS Val1 
FROM MyTable 
+0

Ваш подход правильный, однако столбец уже находится в символьном типе. вам нужно сначала преобразовать его в 'datetime', а затем преобразовать обратно в соответствии с требуемым форматом. что-то вроде этого 'CONVERT (VARCHAR (20), CONVERT (DATE, [Values]), 101)'. +1 – ughai

0

если ваш формат exaclty mm/dd/yyyy hh:mm:ss AM/PM

select * 
from somewhere 
where Values like '[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M' 
    AND ISDATE(Values) = 1 
1

Этот скрипт будет проверять дату правильного формата и сделать первые 10 символов, если это дата в противном случае, он будет выбрать исходное значение значений. Значения примечаний являются зарезервированным словом. В других ситуациях вы можете использовать try_convert от SQLServer 2012.

DECLARE @t table([Values] varchar(50)) 

INSERT @t values ('01/20/2015 01:01:01 AM') 
INSERT @t values ('02/28/2014 01:01:01 PM') 
INSERT @t values ('02/35/2014 01:01:01 PM') 
INSERT @t values ('4444') 

SELECT 
    CASE WHEN [Values] like 
    '[01][0-9]/[0-3][0-9]/[1-2][0189][0-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9] [AP]M' 
    and isdate([Values]) = 1 
    THEN 
     left([Values], 10) -- format of date was already verified 
      ELSE [Values] 
     END AS Val1 
FROM @t MyTable 

Результат:

Val1 
01/20/2015 
02/28/2014 
02/35/2014 01:01:01 PM 
4444 
Смежные вопросы