Разобрать дату из неформатированного текста в SQL - PullRequest
9 голосов
/ 11 сентября 2009

Я пытаюсь найти элегантный способ получить дату из текстового столбца, в котором есть такие данные, как «ГГГГММДД» ... поэтому мы можем увидеть «20060508» в качестве значения в столбце, которое мне бы хотелось чтобы иметь возможность вернуться из запроса в качестве даты (8 мая 2006 г.).

Я уверен, что смогу взломать что-то вместе, имея достаточно времени, но подходы, о которых я думаю, кажутся довольно капризными, и я подозреваю, что есть способ, которым это можно элегантно сделать в одном запросе.

Есть предложения?

Ответы [ 4 ]

25 голосов
/ 11 сентября 2009

Это уже действительная дата - формат ISO-8601 - просто используйте:

SELECT CAST('20060508' AS DATETIME)

или альтернативно:

SELECT CONVERT(DATETIME, '20060508', 112)

и это должно быть прекрасно!

Чтобы получить отображение «08 мая 2006 г.», выполните другое преобразование в varchar, используя стиль преобразования даты 107:

SELECT CONVERT(VARCHAR(25), CAST('2006-05-08' AS DATETIME), 107)

См. здесь для получения дополнительной информации о преобразовании и преобразовании в MS SQL

2 голосов
/ 11 сентября 2009
select cast('20060508' as datetime) AS MyDate

дает вам этот результат ...

MyDate
-----------------------
2006-05-08 00:00:00.000

См. здесь для получения дополнительной информации о приведении и преобразовании в MS SQL.

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

1 голос
/ 11 сентября 2009

попробовать:

SELECT REPLACE(CONVERT(varchar(30),CONVERT(datetime, '20060508'),107),' 0',' ')

вывод:

-------------------
May 8, 2006

(1 row(s) affected)
1 голос
/ 11 сентября 2009

Нет пота, просто КОНВЕРТ это. Стиль "112", или ISO будет обрабатывать ваш пример.

SELECT CONVERT(datetime,'20060508',112)

возвращает

 ----------------------- 2006-05-08 00:00:00.000

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